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

2021-08-05 20:17:42 字數 997 閱讀 9072

這個問題可以分為三種情況來考慮:

情況一: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 已知 雖然情況一是第乙個情況,但是看上去比較複雜...