【dfs】二叉树的最近公共祖先

文章介绍了如何通过两次遍历二叉树的方法,在先序遍历过程中查找最近公共祖先。作者使用`ans`变量存储公共祖先,同时利用`pTrue`和`qTrue`标记节点是否为p或q,确保找到最近的公共祖先。
摘要由CSDN通过智能技术生成

题目:

思路:

两次遍历二叉树,首先遍历全部的二叉树节点。在遍历的同时判断每个二叉树的节点是否为p,q的公共祖先。如果是公共祖先 用一个变量ans 存储该节点。然后重复此过程最终ans一定是最近公共最先。  为什么ans最终一定为最近公共祖先:我想的是在遍历的过程中一直在找全部的公共最先并且第一次遍历是先序遍历,是从根节点逐渐向下遍历。所以找到的公共祖先离p,q越来越近。(至于怎么证明我不会)


/**
 * @auther start
 * @create 2024-02-08 10:32
 */
public class L236 {
    //ans存储公共最先
    TreeNode ans;
    //如果找到了p,q,使用这两个变量标记
    boolean pTrue, qTrue;
    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
        ans = new TreeNode();
        dfsTmp(root,p,q);
        return ans;
    }

    //判断节点树中是否存在p,q
    public void dfs(TreeNode root, TreeNode p, TreeNode q){
        if (root == null) return;
        if (root == p) pTrue = true;
        if (root == q) qTrue = true;
        dfs(root.left,p,q);
        dfs(root.right,p,q);

    }
    //第一次遍历,遍历全部的节点,先序遍历
    public void dfsTmp(TreeNode root, TreeNode p, TreeNode q) {
        if (root == null) return;;
        //判断这个节点树是否有p,q
        dfs(root,p,q);
        //如果这个节点树中有p和q使用ans保存
        if (pTrue && qTrue) ans = root;
        //恢复变量为默认状态
        pTrue = false;
        qTrue = false;
        dfsTmp(root.left,p,q);
        dfsTmp(root.right,p,q);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值