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

相关推荐
এ᭄画画的北北20 分钟前
力扣-234.回文链表
算法·leetcode·链表
八股文领域大手子1 小时前
深入理解缓存淘汰策略:LRU 与 LFU 算法详解及 Java 实现
java·数据库·算法·缓存·mybatis·哈希算法
__lost1 小时前
C++ 解决一个简单的图论问题 —— 最小生成树(以 Prim 算法为例)
算法·图论·最小生成树·prim算法
wuqingshun3141593 小时前
蓝桥杯 11. 打印大X
数据结构·算法·职场和发展·蓝桥杯·深度优先
Blossom.1183 小时前
量子网络:构建未来通信的超高速“高速公路”
网络·opencv·算法·安全·机器学习·密码学·量子计算
A林玖3 小时前
【机器学习】朴素贝叶斯
人工智能·算法·机器学习
六边形战士DONK3 小时前
神经网络基础[损失函数,bp算法,梯度下降算法 ]
人工智能·神经网络·算法
wuqingshun3141594 小时前
蓝桥杯 2. 确定字符串是否是另一个的排列
数据结构·c++·算法·职场和发展·蓝桥杯
小刘|4 小时前
JVM 自动内存管理
java·jvm·算法
小羊不会c++吗(黑客小羊)4 小时前
c++头文件知识
算法