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


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

    思路来自: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;
        }
    }

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

  • 相关阅读:
    AtCoder Grand Contest 001F Wide Swap
    生成函数/母函数入门学习
    树的点分治入门小结
    树链剖分入门小结
    有重复元素的全排列
    二项式界
    二项系数
    排列问题、组合问题
    容斥原理
    P3372 【模板】线段树 1
  • 原文地址:https://www.cnblogs.com/WellHold/p/7538174.html
Copyright © 2020-2023  润新知