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

相关推荐
GalaxyPokemon1 小时前
归并排序:分治思想的高效排序
数据结构·算法·排序算法
ThreeYear_s1 小时前
基于FPGA的PID算法学习———实现PI比例控制算法
学习·算法·fpga开发
Coding小公仔3 小时前
LeetCode 240 搜索二维矩阵 II
算法·leetcode·矩阵
C++chaofan3 小时前
74. 搜索二维矩阵
java·算法·leetcode·矩阵
Studying 开龙wu4 小时前
机器学习监督学习实战五:六种算法对声呐回波信号进行分类
学习·算法·机器学习
Mi Manchi265 小时前
力扣热题100之二叉树的层序遍历
python·算法·leetcode
wu~9705 小时前
leetcode:42. 接雨水(秒变简单题)
算法·leetcode·职场和发展
zhurui_xiaozhuzaizai6 小时前
模型训练-关于token【低概率token, 高熵token】
人工智能·算法·自然语言处理
ThreeYear_s6 小时前
基于FPGA的PID算法学习———实现PID比例控制算法
学习·算法·fpga开发