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

相关推荐
Hello.Reader5 小时前
双卡 A100 + Ollama 生产部署从安装、踩坑、调优到最终可上线方案
linux·人工智能·算法
计算机安禾5 小时前
【数据结构与算法】第30篇:哈希表(Hash Table)
数据结构·学习·算法·哈希算法·散列表·visual studio
xiaoye-duck5 小时前
《算法题讲解指南:动态规划算法--子序列问题(附总结)》--32.最长的斐波那契子序列的长度,33.最长等差数列,34.等差数列划分II-子序列
c++·算法·动态规划
sinat_255487815 小时前
泛型:超级、扩展、列表·学习笔记
java·windows·学习·算法
切糕师学AI5 小时前
Elasticsearch RRF(倒数排序融合)技术详解与实践
算法·elasticsearch·搜索引擎·混合搜索·rrf·归一化问题
lihao lihao5 小时前
进程地址空间
数据结构·c++·算法
Byte不洛5 小时前
LeetCode双指针经典题
c++·算法·leetcode·双指针
汀、人工智能6 小时前
[特殊字符] 第16课:最小覆盖子串
数据结构·算法·数据库架构·图论·bfs·最小覆盖子串
米粒16 小时前
力扣算法刷题 Day 34
算法·leetcode·职场和发展