力扣236題(二叉樹最近公共祖先)
阿新 • • 發佈:2021-10-08
看的程式碼隨想錄的解析
236、二叉樹的最近公共祖先
基本思想:
自底向上查詢,就可以找到公共祖先
回溯就是自底向上
後序遍歷是天然的回溯過程,最先處理的一定是葉子節點
具體實現:
找到一個節點,左子樹出現節點p,右子樹出現節點q(反過來也行),那麼該節點就是節點p和q的最近公共祖先。
遞迴三步:
1、返回值以及引數
返回值:
找到最近公共節點,返回最近公共節點
遇到p或q,返回p或q
啥也沒找到,返回空
引數:
根節點,p,q
2、確定終止條件
找到p或q,或者空間點,結束遞迴
3、確定單層遞迴邏輯
開始了一個很長的解釋,,,,,,,,
(1)遞迴函式有返回值的兩種情況
a、搜尋一條邊的寫法
b、搜尋整個樹的寫法
區別:
在遞迴函式有返回值的情況下: 如果要搜尋⼀條邊,遞迴函式返回值不為空的時候,⽴刻返回, 如果搜尋整個樹,直接⽤⼀個變數left、right接住返回值,這個left、right後序還有邏輯處理的需要,也就是後序遍歷中處理中間節點的邏輯(也是回溯)。(2)為什麼要遍歷整棵樹?
因為我們需要對left和right節點進行邏輯處理
而只遍歷一條邊的寫法會直接返回,並不能進行邏輯處理。
用left,right接住左子樹和右子樹的返回值
(3)邏輯處理
如果left和right都不為空,此時的root就是最近公共節點
如果left為空,right不為空,返回right
(4)總結
a、求最小公共祖先,需要從底向上遍歷,只能通過後序遍歷實現
b、在回溯的過程中,必然要遍歷整顆二叉樹,即使找到結果了,依然要把其他節點遍歷玩,因為要是用遞迴函式的返回值(left,right)做邏輯判斷
程式碼:
class Solution { public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) { return lowestCommonAncestor1(root,p,q); } public TreeNode lowestCommonAncestor1(TreeNode root, TreeNode p, TreeNode q){if (root == null || root == p || root == q){ return root; } TreeNode left = lowestCommonAncestor1(root.left,p,q); TreeNode right = lowestCommonAncestor1(root.right ,p, q); if (left != null && right != null){ return root; } if (left == null){ return right; } return left; } }