zoukankan      html  css  js  c++  java
  • leetcode 236. 二叉树的最近公共祖先LCA(后序遍历,回溯)

    LCA(Least Common Ancestors),即最近公共祖先,是指在有根树中,找出某两个结点u和v最近的公共祖先。

    题目描述

    给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。
    
    百度百科中最近公共祖先的定义为:“对于有根树 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 为不同节点且均存在于给定的二叉树中。
    
    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/lowest-common-ancestor-of-a-binary-tree
    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

    递归1

     后序遍历,回溯

      对每个节点对应的子树,若该子树不含有p或q,返回nullptr;否则,如果p和q分别位于当前子树根节点两侧,则返回当前节点,否则(p和q在同一侧,或者只有某一侧有p或q)返回来自左边或右边的LCA。

    /**
     * Definition for a binary tree node.
     * public class TreeNode {
     *     int val;
     *     TreeNode left;
     *     TreeNode right;
     *     TreeNode(int x) { val = x; }
     * }
     */
    class Solution {
        public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
            if (root==null || root == p || root == q) return root;
            TreeNode left = lowestCommonAncestor(root.left, p, q);
            TreeNode right = lowestCommonAncestor(root.right, p, q);
            if (left!=null && right!=null) return root;
            return left!=null ? left : right;
        }
    }

    递归法2

    思路

    二叉树做后序遍历,回溯:
        回溯时: 捕获mid,即当前节点是否为p或q; 当 left right mid 三个中有两个为True时,说明当前节点是最近的公共节点,记录至res;
        返回值: 左子树或右子树或当前节点中包含p或q;
    最终,返回最近公共节点res。

    class Solution {
        TreeNode res = null;
        public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
            dfs(root, p, q);
            return res;
        }
        private int dfs(TreeNode root, TreeNode p, TreeNode q){
            if(root == null) return 0;
            int left = dfs(root.left, p, q);
            int right = dfs(root.right, p, q);
            int mid = root == p || root == q ? 1 : 0;
            if(left + right + mid > 1) res = root;
            return left + right + mid > 0 ? 1 : 0;
        }
    }
  • 相关阅读:
    python之jupyter
    python处理图片
    python之图片指纹(唯一性的)
    python之操作elasticsearch7.6.0
    elasticsearch之索引
    elasticsearch
    Nginx 出现 403 Forbidden解决方案
    centos 防火墙命令
    centos nginx常用的命令
    搭建centos nginx环境
  • 原文地址:https://www.cnblogs.com/haimishasha/p/11512567.html
Copyright © 2011-2022 走看看