(演算法)二叉樹中兩個結點的最近公共父結點

2021-09-07 01:49:25 字數 864 閱讀 2170

二叉樹中兩個結點的最近公共父結點

二叉樹結點的定義如下:

struct treenode;

前面在劍指offer中出現了類似的題目,但要求的思路都不太一樣,請參考:

這裡介紹一種複雜度較低的遞迴實現。

如題我們要找的二叉樹中兩個結點的最近公共結點,如果我們從上往下遞迴,按照深度優先搜尋的方式。

如果當前結點為空,即遍歷到了葉子結點,直接返回null;

如果當前結點等於兩個結點之一,那麼返回該結點;(因為是從上往下遍歷,說明上面的結點都還沒找到這兩個結點)

如果上面兩種情況都不滿足,那麼兩個結點必然存在當前結點的左子樹或者右子樹或者左右子樹當中。

遞迴遍歷左子樹,得到pleft;

遞迴遍歷右子樹,得到pright;

如果pleft==null,則返回pright;

如果pright==null,則返回pleft;

如果pleft,pright都不為null,則返回proot;

(先從上往下遍歷,再從下往上回溯)

#include #include #include #include using namespace std;

struct treenode;

void createbitree(treenode *&pnode,fstream &fin,treenode *&pnodeone,treenode *&pnodetwo)

}treenode* findfirstcommonparentnode(treenode* proot,treenode* pnodeone,treenode* pnodetwo)

int main()

二叉樹找到兩個結點的最近公共祖先

面試題68 i.二叉搜尋樹的最近公共祖先 這是乙個二叉搜尋樹,根節點左邊的數都小於根節點,根節點右邊的數都大於根節點。如果兩個結點的值都小於根節點的值,兩個結點一定都在樹的左邊。都大於根節點的值,那麼兩個結點一定都在樹的右邊。如果乙個大於根節點,乙個小於根節點,那麼根節點一定是最近的公共祖先。總結一...

完全二叉樹兩個結點的公共結點

1 2 3 4 5 6 7 如上圖所示,由正整數 1,2,3,組成了一棵無限大的二叉樹。從某乙個結點到根結點 編號是1的結點 都有一條唯一的路徑,比如從5到根結點的路徑是 5,2,1 從4到根結點的路徑是 4,2,1 從根結點1到根結點的路徑上只包含乙個結點1,因此路徑就是 1 對於兩個結點x和y,...

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

1 原理 二叉搜尋樹是排序過的 位於左子樹的結點都比父結點小,位於右子樹的結點都比父結點大,我們只需從根節點開始和兩個輸入的結點進行比較,如果當前節點的值比兩個結點的值都大,那麼最低的公共祖先結點一定在該結點的左子樹中,下一步開遍歷當前結點的左子樹。如果當前節點的值比兩個結點的值都小,那麼最低的公共...