【CT】LeetCode手撕—236. 二叉树的最近公共祖先

目录

  • 题目
  • [1- 思路](#1- 思路)
  • [2- 实现](#2- 实现)
    • [⭐236. 二叉树的最近公共祖先------题解思路](#⭐236. 二叉树的最近公共祖先——题解思路)
  • [3- ACM实现](#3- ACM实现)

题目


1- 思路

模式识别

  • 模式1:二叉树最近公共祖先 ------> 递归 + 判断

递归思路,分情况判断

  • 1.参数及返回值
    • public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q)
  • 2.递归终止条件
    • 遇到 null root == proot = q 的情况,此时递归结束。
  • 3.单层递归逻辑 4 种情况
    • 递归 left 赋值
    • 递归 right 赋值
    • ① 左右都为 null、此时返回 null
    • ② 左不 **null** 、右 **null** 返回左
    • ③ 左 **null**、右不 **null** 返回右
    • ④ 直接返回 root

2- 实现

⭐236. 二叉树的最近公共祖先------题解思路

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 left;
        }else if(left==null && right!=null){
            return right;
        }else{
            return root;
        }
    }
}

3- ACM实现

java 复制代码
public class lowestCommonAncestor {


    static class TreeNode{
        int val;
        TreeNode left;
        TreeNode right;
        TreeNode(){}
        TreeNode(int x){
            val = x;
        }
    }


    public static TreeNode build(Integer[] nums){
        TreeNode root = new TreeNode(nums[0]);
        Queue<TreeNode> queue =new LinkedList<>();
        queue.offer(root);
        int index = 1;
        while(!queue.isEmpty() && index < nums.length){
            TreeNode node = queue.poll();

            if(nums[index]!=null && index<nums.length){
                node.left = new TreeNode(nums[index]);
                queue.offer(node.left);
            }
            index++;
            if(nums[index]!=null && index<nums.length){
                node.right = new TreeNode(nums[index]);
                queue.offer(node.right);
            }
            index++;
        }
        return root;
    }


    public static TreeNode findOne(TreeNode root,int val){
        if(root==null) return root;
        if(root.val == val) return root;

        TreeNode left = findOne(root.left,val);
        if(left!=null) return left;
        return findOne(root.right,val);
    }


    public static 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 left;
        }else if(left==null && right!=null){
            return right;
        }else{
            return root;
        }
    }
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("输入二叉树构造数组");
        String input = sc.nextLine();
        input = input.replace("[","");
        input = input.replace("]","");
        String[] parts = input.split(",");
        Integer[] nums = new Integer[parts.length];
        for(int i = 0 ; i <parts.length;i++){
            if(!parts[i].equals("null")){
                nums[i] = Integer.parseInt(parts[i]);
            }else{
                nums[i] = null;
            }
        }

        TreeNode root = build(nums);
        System.out.println("输入val1");
        TreeNode p = findOne(root,sc.nextInt());

        System.out.println("输入val2");
        TreeNode q = findOne(root,sc.nextInt());

        TreeNode res = lowestCommonAncestor(root,p,q);
        System.out.println("公共父节点值为"+res.val);
    }
}

相关推荐
圈圈编码2 分钟前
LeetCode Hot100刷题——轮转数组
java·算法·leetcode·职场和发展
金融小师妹4 小时前
应用BERT-GCN跨模态情绪分析:贸易缓和与金价波动的AI归因
大数据·人工智能·算法
广州智造4 小时前
OptiStruct实例:3D实体转子分析
数据库·人工智能·算法·机器学习·数学建模·3d·性能优化
Trent19856 小时前
影楼精修-肤色统一算法解析
图像处理·人工智能·算法·计算机视觉
feifeigo1236 小时前
高光谱遥感图像处理之数据分类的fcm算法
图像处理·算法·分类
北上ing7 小时前
算法练习:19.JZ29 顺时针打印矩阵
算法·leetcode·矩阵
.格子衫.8 小时前
真题卷001——算法备赛
算法
XiaoyaoCarter9 小时前
每日一道leetcode
c++·算法·leetcode·职场和发展·二分查找·深度优先·前缀树
Hygge-star9 小时前
【数据结构】二分查找5.12
java·数据结构·程序人生·算法·学习方法
June`10 小时前
专题二:二叉树的深度搜索(二叉树剪枝)
c++·算法·深度优先·剪枝