給定二叉樹(不是二叉搜尋樹)和兩個節點n1和n2,編寫程式以找到他們的最近公共祖先(lowest common ancestor,lca)。
最近公共祖先是兩個節點所有公共祖先中離根節點最遠的節點。
計算節點的最近公共祖先是很有用的。
例如,為了確定樹中節點之間距離:從n1節點到n2節點的距離,可以計算從根到n1的距離加上從根到n2的距離,減去從根到它們最近共同祖先的距離的兩倍。
我們可以從根開始遍歷樹。 如果任一給節點(n1和n2)與根匹配,則根為lca。
如果根與任何節點都不匹配,我們重複左右子樹中尋找節點n1和n2。
如果在其左子樹中存在乙個節點而在右子樹中存在的另乙個節點,則此節點即為lca。
如果兩個節點都位於左子樹中,則lca也位於左子樹中,
否則lca位於右子樹中。
#include usingnamespace
std;
//二叉樹節點
struct
node
;
//根據給定的值,建立乙個二叉樹節點,其左右子樹均為空
node* newnode(int
key) //
返回指向給定節點 n1 和 n1 lca 的指標
// 此方法假定節點 n1 和 n2 在數中均出現
struct node *findlca(struct node* root, int n1, int
n2)
intmain()
二叉樹中找出2個節點的最近公共祖先
給定二叉樹和兩個節點n1和n2,編寫程式以找到他們的最近公共祖先。在做這個之前,有些東西需要提前問清楚,二叉樹是不是二叉搜尋樹,如果是二叉搜尋樹,那就好處理多了.在保證2個節點都屬於此二叉樹的情況下,由於二叉搜尋樹是排序過的,位於左子樹的結點都比父結點小,而位於右子樹的結點都比父結點大,node.d...
二叉樹 最近公共父節點
給定二叉樹中的任意兩點,求解該兩點的最近公共父節點。程式大致分為遞迴和非遞迴兩種方式,下面我們先來認識非遞迴的方式。非遞迴程式總體的思路 用一種常見高效的資料結構來記錄下二叉樹中的結構關係,由於是找父節點,所以要用子節點來查詢父節點,我們這裡用到的是hashmap來進行樹形關係的儲存。接下來就是先列...
二叉樹的最近公共父節點
給定一棵二叉樹和兩個節點,找出這兩個節點最近的乙個公共父節點。給出的兩個節點一定在樹中存在 結點的值是隨機的,可能會重複,結點中只包含left和right兩個子結點,沒有指向父節點的parent。此題可參考leetcode 236。考慮兩個結點的存在情況 乙個節點為是另外乙個節點的子或孫子節點,此時...