二叉树oj ----->二叉树的最近公共祖先

题目内容:

解题思路:

公共祖先的意思就是,离这两个结点最近的公共结点,有可能是他们的双亲,也有可能是他们双亲的双亲,所以,我们的解题思路也随之而来了,就是寻找在到达他们的路径上,有没有出现重合的结点,那么这就是他们的最近的公共祖先

  • 给一个查找路径的方法
  • 将所到的结点,按正确的存储方式放在栈当中
  • 进行比较,如果有相同的,就返回他,若没有就返回null

解题代码:

 

class Solution {
    public boolean getNode(TreeNode root,Stack<TreeNode> s,TreeNode node){
        //进行检测,判断是否为空,如果有一个为空,就直接返回
        if(root == null || node == null){
            return false;
        }
        //将结点入栈
        s.push(root);
        //如果结点刚好和node相等就直接返回
        if(root == node){
            return true;
        }

        //开始进行递归,如果在左子树当中就返回true
        if(getNode(root.left,s,node)){
            return true;
        }
        if(getNode(root.right,s,node)){
            return true;
        }
        //走到这里说明此时栈顶的元素不是我们要找结点所走的路径,将栈顶的元素移除掉
        s.pop();
        return false;
    }
    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
        if(root == null || p == null || q == null){
            return null;
        }
        Stack<TreeNode> s1 = new Stack<>();
        Stack<TreeNode> s2 = new Stack<>();

        getNode(root,s1,p);
        getNode(root,s2,q);

        int ps = s1.size();
        int qs = s2.size();

        while(!s1.empty() && !s2.empty()){
            if(s1.peek() == s2.peek()){
                return s1.peek();
            }

            if(ps > qs){
                s1.pop();
                ps--;
            }else if(qs > ps){
                s2.pop();
                qs--;
            }else{
                s1.pop();
                s2.pop();
                ps--;
                qs--;
            }
        }
        return null;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值