常用数据结构算法:二叉树的最近公共祖先

在博客当中看到了一个对二叉树的最近公共祖先的巧解,代码也很是简单,特此用博客记录一下别人大神的思路。

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

遍历判断两个node是否在左右子树中 
一般递归都分为两块返回值; 
第一块返回值(开头): 
针对l或者r的返回,也就是标记,我自己称为小返回 
第二块返回值(结尾): 
l和r已经获取完毕,对上一层的返回,我自己称为大返回

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

这种解法适用于各类二叉树的最近公共祖先的解法。无需考虑是否是搜索树。很是巧妙,并且代码简单易读、

posted @ 2017-09-17 22:11  Wellhold  阅读(531)  评论(0编辑  收藏  举报