zoukankan      html  css  js  c++  java
  • 【LeetCode】236. 二叉树的最近公共祖先

    题目描述

    给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。

    百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”

    例如,给定如下二叉树: root = [3,5,1,6,2,0,8,null,null,7,4]

    示例 1:

    输入: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1
    输出: 3
    解释: 节点 5 和节点 1 的最近公共祖先是节点 3。

    示例 2:

    输入: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 4
    输出: 5
    解释: 节点 5 和节点 4 的最近公共祖先是节点 5。因为根据定义最近公共祖先节点可以为节点本身。

    说明:

    • 所有节点的值都是唯一的。
    • p、q 为不同节点且均存在于给定的二叉树中。

    代码

    /**
     * 时间复杂度:O(n) 每个节点最多就遍历一次
     * 空间复杂度:O(n) 用到栈空间
     */
    class Solution {
        public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
            if(root == null)
                return null;
            if(p == root || q == root)
                return root;
    
            TreeNode left = lowestCommonAncestor(root.left, p, q);
            TreeNode right = lowestCommonAncestor(root.right, p, q);
    
            if(left == null && right == null)
                // 根节点为空,公共祖先便为空
                return null;
            else if(left != null && right != null)
                // 左右两边各一个节点,那root一定是p、q的公共祖先
                return root;
            else if(left == null)
                // 左子树为空,那就只用看右子树的根
                return right;
            else if(right == null)
                // 右子树为空,那就只用看左子树的根
                return left;
            
            // 因为函数的返回值是TreeNode,最后一定要return
            return null;
           
        }
    }
    
  • 相关阅读:
    Android OpenGL ES 2.0 (四) 灯光perfragment lighting
    Android OpenGL ES 2.0 (五) 添加材质
    冒泡排序函数
    javascript object 转换为 json格式 toJSONString
    Liunx CentOS 下载地址
    jquery 图片切换特效 鼠标点击左右按钮焦点图切换滚动
    javascript 解析csv 的function
    mysql Innodb Shutdown completed; log sequence number解决办法
    Centos 添加 yum
    javascript 键值转换
  • 原文地址:https://www.cnblogs.com/melodyjerry/p/12862391.html
Copyright © 2011-2022 走看看