代码随想录算法训练营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

相关推荐
All for pursuit.2 分钟前
【回溯-4】46.全排列
数据结构·c++·算法·leetcode
小鱼~~5 分钟前
Recall@K、Precision@K、MRR、nDCG@K简介
人工智能·算法·机器学习
在所不辞兄9 分钟前
【零基础学智能仿真-38】从规则矩形到带孔薄板:Gmsh 网格与 FEniCSx 联合求解
人工智能·深度学习·算法·机器学习·工程仿真
一木 之林42 分钟前
DDPM扩散模型代码实战:前向加噪造数据、U-Net噪声预测与反向生成手写数字
人工智能·算法·计算机视觉
嘎嘎风1 小时前
MiniMind 学习笔记之 02 字是怎么变成数字的?
算法
QAQmmttyyy1 小时前
ChatFly 开发实录 ⑧|一个 VAD 的自我修养
算法
Logic1011 小时前
关于汉诺塔问题的分析
c语言·算法·递归·函数·解题思路·递归函数·汉诺塔问题
维克兜率天1 小时前
【维克】配对交易的季节性:哪些品种适合长拿?
android·开发语言·笔记·python·算法·kotlin·量化
青少儿编程课堂2 小时前
树上启发式合并详解:子树颜色众数统计与复杂度拆解
c++·python·算法·bfs·信息学竞赛
hahaha60162 小时前
完美反射法--白平衡算法
人工智能·算法