代码随想录算法训练营DAY20 | 二叉树(7) (续)

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

题目链接:236.二叉树的最近公共祖先https://leetcode.cn/problems/lowest-common-ancestor-of-a-binary-tree/description/

思路:利用后序遍历是天然回溯过程、方便实现自底向上查找的原理,递归寻找公共祖先。

java 复制代码
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 null;
        }else if(left == null && right != null){//在左或右找到一个指定节点
            return right;
        }else if(left != null && right == null){
            return left;
        }else{//两个指定节点都找到
            return root;
        }
    }
}
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */

二、LeetCode 235 二叉搜索树的最近公共祖先

题目链接:235.二叉搜索树的最近公共祖先https://leetcode.cn/problems/lowest-common-ancestor-of-a-binary-search-tree/description/

思路:利用二叉搜索树有序的特性,前中后序遍历皆可,找到介于q、q之间的root。

java 复制代码
class Solution {
    //利用二叉搜索树的特性,root.val第一次出现在p、q之间即为最近公共祖先
    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
        if(root.val > p.val && root.val > q.val){//root的值大于p、q的值 应该往root左子树找
            return lowestCommonAncestor(root.left,p,q);
        }else if(root.val < p.val && root.val < q.val){//root的值小于p、q的值 应该往root右子树找
            return lowestCommonAncestor(root.right,p,q);
        }else{//在两者之间,直接返回
            return root;
        }
    }
}
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */

三、小结

这世界总有人忙忙碌碌寻宝藏~ 待会见ovo

相关推荐
jz_ddk2 小时前
[实战]调频(FM)和调幅(AM)信号生成(完整C语言实现)
c语言·算法·信号处理
CloudAce云一2 小时前
谷歌云代理商:谷歌云TPU/GPU如何加速您的AI模型训练和推理
算法
轻语呢喃3 小时前
每日LeetCode : 杨辉三角
javascript·后端·算法
YuTaoShao3 小时前
【LeetCode 热题 100】148. 排序链表——(解法二)分治
java·算法·leetcode·链表
Shilong Wang3 小时前
三维旋转沿轴分解
算法·计算机视觉·机器人
ygming4 小时前
Q43- code973- 最接近原点的 K 个点 + Q44- code347- 前 K 个高频元素
前端·算法
lightqjx4 小时前
【数据结构】顺序表(sequential list)
c语言·开发语言·数据结构·算法
ygming4 小时前
Hashmap/ Hashset- Q39~Q42内容
前端·算法
蒟蒻小袁4 小时前
力扣面试150题--全排列
算法·leetcode·面试
mit6.8245 小时前
[Backlog] 核心协调器 | 终端用户界面(TUI)实现 | 多分支任务冲突解决 | 测试验证体系
人工智能·算法