POJ 2499 求二叉树结点到根结点的路径长度 递归 二叉树

这题主要求二叉树结点到根结点的路径长度,基本的思路是 比较a与b,如果a大则当前结点是左孩子,a-b作为父结点的左数,父结点的右数与当前右数相等;如果b大则当前结点为右孩子,同理可以求父结点,直到父结点为(1,1)遍历结束。

当用原始的递归算法会超时,需要考虑a=1或b=1的特殊情况,同时利用a与b的倍数关系加快遍历速度

Source Code

Problem: 2499   User: yangliuACMer
Memory: 244K   Time: 0MS
Language: C++   Result: Accepted
#include <iostream>
using namespace std;

void TravelCount(int &l, int &r, int a, int b){
	/*递归形式的原始算法,没有优化,TLE
	if(a == 1 && b == 1){
		return;
	}
	if(a > b){//(a,b)为左孩子
		TravelCount(++l,r,a-b,b);
	}
	else TravelCount(l,++r,a,b-a);*/
	//改递归形式为循环形式(非递归形式)
	while(a != 1 || b != 1){
		if(a == 1){//若仅a为1,则只走右路,该点必然是右孩子,直接求差换算成步数
			r += b - a;
			break;	
		}
		if(b == 1){
			l += a - b;
			break;
		}
		//利用a与b的倍数关系,每次走多步,加快遍历速度
		if(a > b){
			l += a/b;
			a -= b * (a/b);
		}
		else{
			r += b/a;
			b -= a * (b/a);
		}
	}
}
int main(){
	int n,a,b,l,r,i=1;
	cin>>n;
	while(n--){
		cin>>a>>b;
		l = r = 0;
		TravelCount(l,r,a,b);
		cout<<"Scenario #"<<(i++)<<":"<<endl;
		cout<<l<<" "<<r<<endl<<endl;
	}
	return 0;
}


参考了 http://www.cnblogs.com/allensun/archive/2010/11/08/1872028.html


你可能感兴趣的:(算法,优化,user,2010)