二叉樹的相關面試題
阿新 • • 發佈:2019-01-06
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;
}
}