這個問題可以分為三種情況來考慮:
情況一:root未知,但是每個節點都有parent指標
此時可以分別從兩個節點開始,沿著parent指標走向根節點,得到兩個鍊錶,然後求兩個鍊錶的第乙個公共節點,這個方法很簡單,不需要詳細解釋的。
情況二:節點只有左、右指標,沒有parent指標,root已知
思路:有兩種情況,一是要找的這兩個節點(a, b),在要遍歷的節點(root)的兩側,那麼這個節點就是這兩個節點的最近公共父節點;
二是兩個節點在同一側,則 root->left 或者 root->right 為 null,另一邊返回a或者b。那麼另一邊返回的就是他們的最小公共父節點。
遞迴有兩個出口,一是沒有找到a或者b,則返回null;二是只要碰到a或者b,就立刻返回。
[cpp]view plain
copy
// 二叉樹結點的描述
typedef
struct
bitnode
binarytreenode;
// 節點只有左指標、右指標,沒有parent指標,root已知
binarytreenode* findlowestcommonancestor(binarytreenode* root , binarytreenode* a , binarytreenode* b)
情況三: 二叉樹是個二叉查詢樹,且root和兩個節點的值(a, b)已知
[cpp]view plain
copy
// 二叉樹是個二叉查詢樹,且root和兩個節點的值(a, b)已知
binarytreenode* findlowestcommonancestor(binarytreenode* root , binarytreenode* a , binarytreenode* b)
return
null;
}
二叉樹 最近公共父節點
給定二叉樹中的任意兩點,求解該兩點的最近公共父節點。程式大致分為遞迴和非遞迴兩種方式,下面我們先來認識非遞迴的方式。非遞迴程式總體的思路 用一種常見高效的資料結構來記錄下二叉樹中的結構關係,由於是找父節點,所以要用子節點來查詢父節點,我們這裡用到的是hashmap來進行樹形關係的儲存。接下來就是先列...
二叉樹的最近公共父節點
給定一棵二叉樹和兩個節點,找出這兩個節點最近的乙個公共父節點。給出的兩個節點一定在樹中存在 結點的值是隨機的,可能會重複,結點中只包含left和right兩個子結點,沒有指向父節點的parent。此題可參考leetcode 236。考慮兩個結點的存在情況 乙個節點為是另外乙個節點的子或孫子節點,此時...
二叉樹兩個節點的公共節點
很流行的乙個問題,常見於各種面試中,這裡有乙個很好的彙總.情況1.節點只有left right,沒有parent指標,root已知 情況2.root未知,但是每個節點都有parent指標 情況3.二叉樹是個二叉查詢樹,且root和兩個節點的值 a,b 已知 雖然情況一是第乙個情況,但是看上去比較複雜...