leetcode 236 二叉樹的最近公共祖先

2021-10-20 20:49:36 字數 2067 閱讀 8122

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

最近公共祖先的定義為:「對於有根樹 t 的兩個節點 p、q,最近公共祖先表示為乙個節點 x,滿足 x 是 p、q 的祖先且 x 的深度盡可能大

(乙個節點也可以是它自己的祖先)。」

func lowestcommonancestor(_ root: treenode?, _ p: treenode?, _ q: treenode?) -> treenode? 

if n.val == lhs.val || n.val == rhs.val

let left = lowestcommonancestor(n.left, p, q)

let right = lowestcommonancestor(n.right, p, q)

if left == nil

if right == nil

return n

}

說明:

一定存在根節點,

找到了乙個,就不會繼續往下找了,這條線 ( 左邊的 ) 斷了,

就只看右邊找不找得到。

對應的值,在左邊剩餘的,在左邊沒有去找的結點中

有兩個點,找到了,就打住

所以不會有乙個點,重複命中

遞迴的特性,是自底部向上

最近, lowest, 最底部,

建議使用遞迴

解決樹 tree 問題的訣竅,是關注乙個點 node

only focus on a ****** node

乙個 node , 代表乙個 function call

分為兩種情況

情況一

情況 2

帶入一

左邊,5 ,找到了, 返回 5, 左邊停止訪問

右邊,1 ,找到了, 返回 1, 右邊停止訪問

result 是 root

帶入 2

左邊,5 ,找到了, 返回 5, 左邊停止訪問

右邊,1 ,去尋找

左邊 0, 不是,返回 nil, 停止訪問

右邊 8, 不是,返回 nil, 停止訪問

第一步的遞迴呼叫出結果

左邊,5 ,找到了

右邊,nil, 沒找到

result 是左邊

輔助測試**:

let three = treenode(3)

let five = treenode(5)

let one = treenode(1)

let six = treenode(6)

let two = treenode(2)

let zero = treenode(0)

let eight = treenode(8)

let seven = treenode(7)

let four = treenode(4)

three.left = five

three.right = one

five.left = six

five.right = two

one.left = zero

one.right = eight

two.left = seven

two.right = four

let result = solution().lowestcommonancestor(three, five, one)

print(result?.val ?? "")

LeetCode236 二叉樹最近祖先

思考 這個函式就是查詢p,q兩個節點的祖先,然後給了這棵樹的root,1 它先進行判斷,根節點是不是null 或者根節點是否是p q,要是有乙個是,那祖先就肯定是root 2 它用了遞迴的思想去查詢左右兩個子樹,因為pq的祖先要麼在左邊,要麼就在右邊,所以肯定能找到乙個祖先。3 若找到的left 子...

LeetCode 236 二叉樹最近公共祖先

leetcode 236 二叉樹最近公共祖先 236.二叉樹的最近公共祖先 題目描述 給定乙個二叉樹,找到該樹中兩個指定節點的最近公共祖先。解體思路 分兩部分解決 第一部分 實現判斷兩個結點包含於某根節點的子樹內 第二部分 先序遍歷二叉樹,如果根節點的子樹包含qp目標結點 傳入左孩子,進行遞迴。傳入...

leetcode 236 二叉樹最近公共祖先

給定乙個二叉樹,找到該樹中兩個指定節點的最近公共祖先。例如,給定如下二叉樹 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 的最近公共祖先是節點 ...