求二叉樹中兩個節點的最低公共祖先

2021-08-04 13:13:59 字數 1757 閱讀 9874

//結點結構

template

struct binarysearchtreenode

binarysearchtreenode* _left;

binarysearchtreenode* _right;

binarysearchtreenode* _parent;

v _val;

};

//尋找最低公共祖先

binarysearchtreenode* _publicancestor(binarysearchtreenode* proot, binarysearchtreenode* node1, binarysearchtreenode* node2)

return

null;

}

2、該樹是一棵有父指標的二叉樹

一棵具有父指標的樹,那麼該樹的葉子節點到根結點是乙個由_pparent指標鏈起來的鍊錶。輸入兩個結點,那麼這兩個結點位於兩條鏈上,這兩個結點的最低公共祖先就是這兩條鏈的第乙個公共結點。那麼求兩個結點的最低公共祖先問題就轉換成求兩個鍊錶的第乙個公共結點問題。

具體**實現:

//鍊錶結點結構

typedef struct node

node,*pnode;

//求鍊錶長度

int sizeoflist(pnode phead)

return count;

}//獲取兩個鍊錶的第乙個公共結點

pnode getfirstpublicnode(pnode phead1,pnode phead2)

size1=sizeoflist(phead1);//求鍊錶長度

size2=sizeoflist(phead2);

size=size1-size2;

if(size>

0)

pl1=pl1->next;

pl2=pl2->next;

if(pl1==pl2)

}else

pl1=pl1->next;

pl2=pl2->next;

if(pl1==pl2)

}return

null;

}

3、該樹是一棵普通的樹

對於一棵普通的樹,常規的解法就是從根結點開始遍歷,每遍歷到乙個結點的時候就判斷兩個輸入的結點是否在它的子樹中,如果在,則繼續再遍歷它的所有子節點,這樣一直向下遍歷,直到找到最低祖先為止。但是這樣的解法會使得乙個結點重複被遍歷多次,效率太低了。

但是我們可以這樣做:可以先儲存該樹的根結點到輸入的兩個結點的路徑至棧中,然後再尋找最低公共祖先。

具體實現:

//找結點路徑

bool findpath(binarytreenode* proot, binarytreenode* node, stack

*> &s)

return

true;

}//最低公共祖先結點

binarytreenode* _lowestpublicancestor(binarytreenode* proot, binarytreenode* node1, binarytreenode* node2)

else

}while (!s1.empty() && !s2.empty() && s1.top() != s2.top())

return s1.top();

}

二叉樹中兩個節點的最低公共祖先

求二叉樹樹中的兩個節點的最低公共祖先是個有趣的問題,涉及到對遞迴的理解。可以參考部落格 下面是乙個簡單的複雜度為 o n 的演算法,解決lca問題 1 找到從根到n1的路徑,並儲存在乙個向量或陣列中。2 找到從根到n2的路徑,並儲存在乙個向量或陣列中。3 遍歷這兩條路徑,直到遇到乙個不同的節點,則前...

二叉樹兩個節點的公共節點

很流行的乙個問題,常見於各種面試中,這裡有乙個很好的彙總.情況1.節點只有left right,沒有parent指標,root已知 情況2.root未知,但是每個節點都有parent指標 情況3.二叉樹是個二叉查詢樹,且root和兩個節點的值 a,b 已知 雖然情況一是第乙個情況,但是看上去比較複雜...

求二叉樹中兩個節點的最近公共祖先

比如 在如圖這棵二叉樹中,8和9的公共祖先是1,4和5的公共祖先是2,5和2的公共祖先是2。在上述分析中,我們可以得出思路,本題解法可分為兩種情況,1 兩個節點在根節點同側 則它們的最近公共祖先可能是其中乙個節點,也可能是在到兩個節點的公共路徑上。2 兩個節點在根節點的不同側,則它們的公共祖先只能是...