題目描述:
給定一棵二叉樹的根節點 root 和 treenode 類物件的陣列(列表) nodes,返回 nodes 中所有節點的最近公共祖先(lca)。陣列(列表)中所有節點都存在於該二叉樹中,且二叉樹中所有節點的值都是互不相同的。
我們擴充套件二叉樹的最近公共祖先節點在維基百科上的定義:「對於任意合理的 i 值, n 個節點 p1 、 p2、…、 pn 在二叉樹 t 中的最近公共祖先節點是後代中包含所有節點 pi 的最深節點(我們允許乙個節點是其自身的後代)」。乙個節點 x 的後代節點是節點 x 到某一葉節點間的路徑中的節點 y
示例 1:
輸入: root = [3,5,1,6,2,0,8,null,null,7,4], nodes = [4,7]
輸出: 2
解釋: 節點 4 和 7 的最近公共祖先是 2。
示例 2:
輸入: root = [3,5,1,6,2,0,8,null,null,7,4], nodes = [1]
輸出: 1
解釋: 單個節點的最近公共祖先是該節點本身。
示例 3:
輸入: root = [3,5,1,6,2,0,8,null,null,7,4], nodes = [7,6,2,4]
輸出: 5
解釋: 節點 7、6、2 和 4 的最近公共祖先節點是 5。
示例 4:
輸入: root = [3,5,1,6,2,0,8,null,null,7,4], nodes = [0,1,2,3,4,5,6,7,8]
輸出: 3
解釋: 樹中所有節點的最近公共祖先是根節點。
樹中節點個數的範圍是 [1, 104] 。
-109 <= node.val <= 109
所有的 node.val 都是互不相同的。
所有的 nodes[i] 都存在於該樹中。
所有的 nodes[i] 都是互不相同的。
方法1:
(1)使用雜湊統計標識結點值;
/**
* definition for a binary tree node.
* struct treenode
* treenode(int x) : val(x), left(nullptr), right(nullptr) {}
* treenode(int x, treenode *left, treenode *right) : val(x), left(left), right(right) {}
* };
*/class
solution
if(st.
count
(root-
>val)
) treenode* node_left=
find_ancestor
(root-
>left,st)
; treenode* node_right=
find_ancestor
(root-
>right,st);if
(node_left!=
nullptr
&&node_right!=
nullptr
)return node_left!=
nullptr
?node_left:node_right;
//返回有結點值的結點
} treenode*
lowestcommonancestor
(treenode* root, vector
>
&nodes)
return
find_ancestor
(root,st);}
};
二叉樹的最近公共祖先
給定乙個二叉樹,找到該樹中兩個指定節點的最近公共祖先。例如,給定如下二叉樹 root 3,5,1,6,2,0,8,null,null,7,4 思路 剛開始使用boolean來判斷要查詢的兩節點在左右孩子上,後面修改為使用treenode與null判斷兩節點位置 1 分別向左孩子和右孩子遞迴。2 若當...
二叉樹的最近公共祖先
輸入 root 3,5,1,6,2,0,8,null,null,7,4 p 5,q 1 輸出 3 輸入 root 3,5,1,6,2,0,8,null,null,7,4 p 5,q 4 輸出 5 法1 分別找出根節點到兩個節點的路徑,則最後乙個公共節點就是最低公共祖先。法2 public treen...
二叉樹的最近公共祖先
例如,給定如下二叉樹 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,...