1. 程式人生 > 其它 >力扣236題(二叉樹最近公共祖先)

力扣236題(二叉樹最近公共祖先)

看的程式碼隨想錄的解析

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; } }