根據所給結點求出最近公共祖先

2022-05-07 11:12:08 字數 1595 閱讀 1427

問題描述:

給定乙個二叉樹, 找到該樹中兩個指定節點的最近公共祖先。

例如,給定如下二叉樹:  root = [3,5,1,6,2,0,8,null,null,7,4]

示例 1:

輸入: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1

輸出: 3

解釋: 節點 5 和節點 1 的最近公共祖先是節點 3。

示例 2:

輸入: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 4

輸出: 5

解釋: 節點 5 和節點 4 的最近公共祖先是節點 5。因為根據定義最近公共祖先節點可以為節點本身。

說明:所有節點的值都是唯一的。

p、q 為不同節點且均存在於給定的二叉樹中。

遞迴思想:

1.從根節點開始遍歷樹。

2.如果當前節點本身是 p 或 q 中的乙個,我們返回 true,

3.我們分別在左右分支進行查詢p,q

4.如果在遍歷的任何點上,左、右不為空,這意味著我們找到了節點 p 和 q 的最近公共祖先。

public static treenode getlca(treenode root,treenode p,treenode q)

迭代思想: 

使用父指標迭代

如果每個節點都有父指標,那麼我們可以從 p 和 q 返回以獲取它們的祖先。在這個遍歷過程中,我們得到的第乙個公共節點是 lca 節點。我們可以在遍歷樹時將父指標儲存在字典中。

演算法:從根節點開始遍歷樹。

在找到 p 和 q 之前,將父指標儲存在字典中。

一旦我們找到了 p 和 q,我們就可以使用父親字典獲得 p 的所有祖先,並新增到乙個稱為祖先的集合中。

同樣,我們遍歷節點 q 的祖先。如果祖先存在於為 p 設定的祖先中,這意味著這是 p 和 q 之間的第乙個共同祖先(同時向上遍歷),因此這是 lca 節點。

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

if (node.right != null)

}// 定義存放q結點的祖先結點的集合.

setancestors = new hashset<>();

// 將p的祖先節點全部加入到set集合中

while (p != null)

// 找到set集合中包含q節點的結點,

while (!ancestors.contains(q.val))

q = parent.get(q.val);//4

//找到q直接返回

return q;

}

樹的兩個結點的最近公共祖先結點

在 bjfu 資料結構習題 268基於二叉鍊錶的二叉樹葉子結點到根結點的路徑的求解 上修改的 include using namespace std char path 100 char path1 100 char path2 100 typedef struct bitnode bitnode,...

樹(二叉鍊錶,非遞迴)兩結點的最近公共祖先結點

二叉鍊錶非遞迴 查詢兩個結點的最近公共結點 思路 把乙個結點的全部父結點都放到棧中 類似於查詢從根結點到某一結點的路徑 依次出棧判斷這棵樹的後代中是否包括另乙個結點 include include using namespace std const int maxsize 100 typedef s...

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

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