一道多次做错的二叉树题目

二叉树的最近公共祖先

今天在复习时,这道题又一次没有做出来,为了加深记忆,于是写下这篇题解

  • 通过儿子的方式建树

一道多次做错的二叉树题目_第1张图片
思路分析

  • 针对一个节点,如果我们想知道,他是不是该点的祖先我们需要知道该点是否在子树中即可
  • 最近:说明我们需要进行后序遍历,从下到上找,才能找到最近公共祖先
  • 针对最近公共祖先,一共有三种情况
    一道多次做错的二叉树题目_第2张图片
    一道多次做错的二叉树题目_第3张图片
  • 具体思路
    • 返回值:我们需要知道p,q在不在左右子树中,所以如果有pq则返回pq,否则我们返回 null 表示不存在
  • 搜索中的情况(单层逻辑)
    • 针对 当前 搜索点 root 我们如何判断 p q 是否在当前子树中
left right 返回值
null null 毫无疑问返回null,左右子树中都没有p,q
p null 返回p,向root的父节点说明p在 root的子树中 (q同理)
null p 返回p,向root的父节点说明p在 root的子树中(q同理)
p(q) q(p) 情况1说明root为最近根节点返回 root
class Solution {
    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
        return dfs(root,p,q);
        
    }
    TreeNode dfs(TreeNode root,TreeNode p,TreeNode q){
        //1.递归终止条件,root为null,p,q 则直接返回,无需向下搜索
        if(root==null || root==p || root==q)return root;
        //2.如果不满足1,则需要继续向下搜索
        TreeNode left=dfs(root.left,p,q);
        TreeNode right=dfs(root.right,p,q);
        //对于root的父节点,我们需要返回以root为根节点的子树中是否有 p,q
        if(left==null)return right;//right=null,p,q都可以直接返回righr;
        if(right==null)return left;//同上个判断
        //可以到这,说明,left,right都不为空 返回root,作为答案
        return root;
    }
}

小思考
一道多次做错的二叉树题目_第4张图片

你可能感兴趣的:(深度优先)