二叉樹 最近公共父節點

2021-07-12 00:55:10 字數 1091 閱讀 8120

給定二叉樹中的任意兩點,求解該兩點的最近公共父節點。程式大致分為遞迴和非遞迴兩種方式,下面我們先來認識非遞迴的方式。

非遞迴程式總體的思路:用一種常見高效的資料結構來記錄下二叉樹中的結構關係,由於是找父節點,所以要用子節點來查詢父節點,我們這裡用到的是hashmap來進行樹形關係的儲存。接下來就是先列出乙個要求節點的所有父節點,然後比較另乙個要求節點的父節點在不在上面的列中,第乙個出現的節點,就是我們要求的祖先節點。具體**如下:

public treenode lowestcommonancestor(treenode root, treenode p, treenode q) 

}set

set=

new hashset<>();//p節點的所有祖先節點

while (p !=

null)

while (!

set.contains(q))

return q;

}

下面來看遞迴求解過程(只需要抓住一點,兩個節點要麼在左子樹上,要麼在右子樹上,root就更簡單了):

// recursively

public treenode lowestcommonancestor1(treenode root, treenode p, treenode q)

treenode l = lowestcommonancestor(root.left, p, q);

treenode r = lowestcommonancestor(root.right, p, q);

return l != null && r != null?root : l == null?r: l;

}

這個**寫的也是沒誰了,尤其是最後的return,只能膜拜一下了,解釋一下最後的一句返回:首先,判斷左右子樹,如果有空,則返回左子樹,原因是在遞迴程式中,先求解的左子樹的節點;如果左右都不為空,則返回他們的父節點,則這個節點,就應該是結果;後面又加了乙個三目運算子,原因是,上面返回的左子樹有可能為null,比如兩個節點都在root的右子樹上,那麼當左子樹為空時,則返回右子樹;

二叉樹的最近公共父節點

給定一棵二叉樹和兩個節點,找出這兩個節點最近的乙個公共父節點。給出的兩個節點一定在樹中存在 結點的值是隨機的,可能會重複,結點中只包含left和right兩個子結點,沒有指向父節點的parent。此題可參考leetcode 236。考慮兩個結點的存在情況 乙個節點為是另外乙個節點的子或孫子節點,此時...

二叉樹的公共父節點

void findparent node root,node pt1,node pt2 1 對於二叉搜尋樹,裡邊的元素都是排好序的,那麼從根節點向下搜尋,找到第乙個節點p滿足p data pt1 data 且 p data pt2 data 假定pt1 data pt2 data 即是滿足要求的公共...

二叉樹近期公共父節點

在二叉樹中找近期公共父節點。分為兩種情況,一種是有父指標,一種沒有父指標。這樣的情況比較簡單。計算兩個結點的深度,再把深度大的向上移。移到同一深度。在同一時候向上移動,直到兩個結點同樣,這樣便找到了父節點。這個演算法時間複雜度為o n 實現 includestruct node int getdpe...