1
2 3
4 5 6 7
8 9 10 11 12 13 14 15
用例
lca(9, 11) = 2
lca(9. 6) = 1
lca(12, 3) =1
分析
從用例中看,9的祖先是 9/2=4 4/2=2 , 2/2=1, 即(4,2,1都是9的祖先)
11的祖先有(11/2=5, 5/2=2, 2/2=1)
所以這是乙個有規律的樹,在這個樹上我們就可以用上面的方法找到任意乙個結點的所有父節點,然後求父節點的交點即可。
時間o (l
ogn2
)o(^2)
o(logn
2)步驟:獲得x的父節點(x/2, x/2/2, …)
將x的父節點存入陣列中
獲得y的父節點(y/2, y/2/2,…)
將y的父節點存入陣列中
遍歷兩個陣列找到第一次相等的元素,即為最近公共祖先結點。
public
intlca
(int x,
int y)
while
(q >1)
int father =-1
;for
(int i =
0; i < a.
size()
; i++)}
}if(father ==-1
)}
二叉樹的最近公共祖先
給定乙個二叉樹,找到該樹中兩個指定節點的最近公共祖先。例如,給定如下二叉樹 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,...