1. 程式人生 > >二叉樹的相關面試題

二叉樹的相關面試題

1.求二叉樹中最遠的兩個節點的

 思路:解這個題的思路是用遞迴求解,定義一個變數distance,後序遍歷,從葉子節點開始判斷。對於當前節點,求他的左右子樹的高度和 和distance比較,如果高度和大,把他儲存到變數distance中,否則distance不變 

如圖:

int GetFarthestDistance()
	{
		assert(_root);
		int distance=0;  //記錄最遠的距離
		return _GetFarthestDistance(_root,distance);
	}

int _GetFarthestDistance(Node* root,int& distance)
	{
		if(root==NULL)
			return 0;
		//後序遍歷
		int left=_GetFarthestDistance(root->_left ,distance);
		int right=_GetFarthestDistance(root->_right ,distance);
		if(left+right>distance)  //更新distance
			distance=left+right;
		return left>right?left+1:right+1;
	}

2.求兩個節點最近的公共祖先

Node* GetRecentlyAncestor(int root1,int root2)
	{
		stack<Node*> v1;  //儲存到root1路徑
		stack<Node*> v2;  //儲存到root2路徑

		int flag=0;       //判斷有沒有找到
		_GetRecentlyAncestor(_root,root1,v1,flag);
		flag=0;
		_GetRecentlyAncestor(_root,root2,v2,flag);
		Node* top1=v1.top ();
		Node* top2=v2.top ();
		Node* prev=top1;
		//最近的公共祖先就是在路徑中第一不相等的數的前一個
		while((!v1.empty())&&(!v2.empty()))
		{
			if(top1==top2)
			{
				prev=top1;
				v1.pop();
				if(!v1.empty ())
				    top1=v1.top();
				v2.pop();
				if(!v2.empty ())
					top2=v2.top();		
			}
			else
			{
				return prev;
			}
		}
		if(v1.empty()||v2.empty ())
		{
			return prev;
		}
	}

void _GetRecentlyAncestor(Node* root,int rootData,stack<Node*>& v,int& flag)
	{
		if(root==NULL||flag==1)//||flag==1是為了表示找到的節點在最子樹,不用去訪問右子樹了
			return;

		//後序遍歷
		_GetRecentlyAncestor(root->_left ,rootData,v,flag);
		_GetRecentlyAncestor(root->_right,rootData,v,flag);
		//當前節點
		if(root->_data ==rootData||flag==1) //||flag==1是為了表示找到的節點再當前的子樹中
		{
			v.push(root);
			flag=1;
		}

	}