首页 > 其他分享 >LeetCode 236. 二叉树的最近公共祖先

LeetCode 236. 二叉树的最近公共祖先

时间:2023-07-04 19:56:48浏览次数:48  
标签:return nil 祖先 节点 二叉树 236 root LeetCode

题目链接:LeetCode 236. 二叉树的最近公共祖先

题意:

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

解题思路:

  • 利用二叉树的后序遍历回溯(从下往上遍历)的思想,依次遍历整个二叉树,
  • 在遍历过程中,遇到 P 就返回p的父节点,遇到 q 就返回 q 的父节点,(也就是找到了p,q各自的祖先)
  • 然后判断:
  • 情况一:公共祖先是 p 或 q,此时直接返回该节点
  • 情况二:常规的公共祖先,此时左右子树如果都有,就返回根节点,否则返回存在的子树(左右子树均为空的情况就是返回空。)

代码:

// 递归的参数和返回值
func lowestCommonAncestor(root, p, q *TreeNode) *TreeNode {

    if root == nil {
        return nil
    } 
    // 递归的边界
    if root == p || root == q ||root == nil{  //找到p,q 节点就返回
        return root
    }

    left := lowestCommonAncestor(root.Left,p,q)
    right := lowestCommonAncestor(root.Right,p,q)

    // 单层递归的逻辑
    if left != nil && right != nil {
        return root
    }
    if left != nil{
        return left
    } 
    return right

}

标签:return,nil,祖先,节点,二叉树,236,root,LeetCode
From: https://www.cnblogs.com/lxing-go/p/17526825.html

相关文章

  • 1043_二叉树的生成和遍历(循环方式)
    1、遍历方法前序遍历(preOrder)对每个节点(子树)、贯彻这个遍历顺序:根->左->右中序遍历(inOrder)左->根->右后序遍历(postOrder)左->右->根层序遍历一层一层、从左到右遍历参考资料:二叉树各种遍历方法递归和循环实现树的层次遍历的几种方法......
  • [leetcode每日一题]7.4
    2679. 矩阵中的和提示中等46相关企业给你一个下标从 0 开始的二维整数数组 nums 。一开始你的分数为 0 。你需要执行以下操作直到矩阵变为空:矩阵中每一行选取最大的一个数,并删除它。如果一行中有多个最大的数,选择任意一个并删除。在步骤1删除的所有数字中找到最大的一个数......
  • (Leetcode)746
    //方式一:第一步不支付费用classSolution{publicintminCostClimbingStairs(int[]cost){intlen=cost.length;int[]dp=newint[len+1];//从下标为0或下标为1的台阶开始,因此支付费用为0dp[0]=0;dp[1]=0;......
  • leetcode 22. 括号生成
    暴力枚举classSolution{publicList<String>generateParenthesis(intn){List<String>list=getAll(2*n);List<String>result=newArrayList<>();for(Stringitem:list){intvalue=0;......
  • 【LeetCode】矩阵中的和
    给你一个下标从0开始的二维整数数组nums。一开始你的分数为0。你需要执行以下操作直到矩阵变为空:矩阵中每一行选取最大的一个数,并删除它。如果一行中有多个最大的数,选择任意一个并删除。在步骤1删除的所有数字中找到最大的一个数字,将它添加到你的分数中。请你返回最......
  • 【笔试实战】LeetCode题单刷题-编程基础 0 到 1【二】
    1822. 数组元素积的符号题目链接1822. 数组元素积的符号题目描述已知函数 signFunc(x) 将会根据 x 的正负返回特定值:如果 x 是正数,返回 1 。如果 x 是负数,返回 -1 。如果 x 是等于 0 ,返回 0 。给你一个整数数组 nums 。令 product 为数组 nums......
  • LeetCode 501. 二叉搜索树中的众数
    题目链接:LeetCode501.二叉搜索树中的众数题意:给你一个含重复值的二叉搜索树(BST)的根节点root,找出并返回BST中的所有众数(即,出现频率最高的元素)。如果树中有不止一个众数,可以按任意顺序返回。解题思路:递归法由于是二叉搜索树,中序遍历是有序的,因此相当于在一个有序的......
  • LeetCode 图
    200. 岛屿数量695. 岛屿的最大面积精品题解 https://leetcode.cn/problems/number-of-islands/solution/dao-yu-lei-wen-ti-de-tong-yong-jie-fa-dfs-bian-li-/注意深度优先遍历,对一格陆地(=='1')遍历, 就会把与它连通的所有陆地遍历到,全部标记为2,完成一个岛屿。从而这一次......
  • LeetCode -- 767. 重构字符串
     设字符串s长度为lens可以重构为相邻字符串不同时有字符串中出现次数最多的字符<(len+1)>>1当满足上述条件时候,我们就能对其进行重构重构法:先放置偶数位置,再放置奇数位置c++classSolution{public:stringreorganizeString(strings){vector<i......
  • 【LeetCode剑指offer#05】回文链表的两种解法+删除链表中间节点(链表的基本操作)
    回文链表给你一个单链表的头节点head,请你判断该链表是否为回文链表。如果是,返回true;否则,返回false。示例1:输入:head=[1,2,2,1]输出:true示例2:输入:head=[1,2]输出:false提示:链表中节点数目在范围[1,105]内0<=Node.val<=9思路将值复制到数组中后用双指针......