經常使用數據結構算法:二叉樹的最近公共祖先

在博客當中看到了一個對二叉樹的最近公共祖先的巧解,代碼也非常簡單,特此用博客記錄一下別人大神的思路。node

思路來自:http://blog.csdn.net/github_34514750/article/details/52229129git

遍歷判斷兩個node是否在左右子樹中 
通常遞歸都分爲兩塊返回值; 
第一塊返回值(開頭): 
針對l或者r的返回,也就是標記,我本身稱爲小返回 
第二塊返回值(結尾): 
l和r已經獲取完畢,對上一層的返回,我本身稱爲大返回github

public class Solution {
    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
        // 左右子樹探索時發現目標節點,則經過返回值標記
        if(root == null || p == root || q == root) {
            return root;
        }

        // 查看左子樹中是否有目標結點,沒有爲null
        TreeNode l = lowestCommonAncestor(root.left,p,q);
        // 查看右子樹中是否有目標結點,沒有爲null
        TreeNode r = lowestCommonAncestor(root.right,p,q);

        //都不爲空,說明作右子樹都有目標結點,則公共祖先就是自己
        if(l!= null && r!= null) {
            return root;
        }
        // 其餘狀況,則要繼續向上標記,顯示此節點下邊有目標節點
        return l != null?l:r;
    }
}

這種解法適用於各種二叉樹的最近公共祖先的解法。無需考慮是不是搜索樹。非常巧妙,而且代碼簡單易讀、spa

相關文章
相關標籤/搜索