zoukankan      html  css  js  c++  java
  • leetcode 235. Lowest Common Ancestor of a Binary Search Tree

    知识点:

    两个节点的最近公共祖先

    思路:

    用dfs从根节点往下搜索节点,用栈记录从根节点到该节点之间的所有节点。由于栈的先进后出特性,我们就能得到该节点到根节点的序列。

    两个节点的最近公共祖先就是各自往上回溯祖先时的第一个相同的节点。
    由于两个节点到公共祖先的距离不一样,所以两个栈的大小不一样。先计算栈大小的差值,然后将元素多的那个栈的节点先弹出几个节点。接下来两个栈的栈顶元素到公共祖先的距离就是一样了。两个栈同时弹出元素,直到找到共通祖先。

    
    class Solution {
    
        private Stack<TreeNode> pPath=new Stack<>();
        private Stack<TreeNode> qPath=new Stack<>();
        public boolean dfs(TreeNode root,TreeNode t,Stack<TreeNode> s){
    
            if(root !=null){
                if(root.val ==t.val){
                    return true;
                }else {
                    s.push(root.left);
                    if(dfs(root.left,t,s)) {
                        return true;
                    }else {
                        s.pop();
                    }
                    s.push(root.right);
                    if(dfs(root.right,t,s)){
                        return true;
                    }else {
                        s.pop();
                    }
                    return false;
                }
            }
    
            return false;
        }
        public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
            pPath.push(root );
            dfs(root,p,pPath);
            qPath.push(root );
            dfs(root,q,qPath);
            int h;
            if(pPath.size() > qPath.size()){
                h=pPath.size() - qPath.size();
                for(int i=0;i<h;++i){
                    pPath.pop();
                }
            }else {
                h=qPath.size() - pPath.size();
                for(int i=0;i<h;++i){
                    qPath.pop();
                }
            }
            h=qPath.size();
            TreeNode result = null;
            for(int i=0;i<h;++i){
                if(qPath.peek() == pPath.peek()){
                    result= qPath.peek();
                    break;
                }else {
                    qPath.pop();
                    pPath.pop();
                }
            }
            return result;
        }
    }
  • 相关阅读:
    GridView, ListView 区别
    ActivityGroup和TabActiviy的差异性?
    Java加密解压
    Android代码中实现WAP方式联网
    SVN创建资源库和远程连接配置
    高仿优酷Android客户端图片左右滑动(自动切换)
    andoid 多线程断点下载
    Android中用Java代码实现zip文件解压缩
    JAVA两种实现二分查找方式
    三种JAVA编程方法实现斐波那契数列
  • 原文地址:https://www.cnblogs.com/infoflow/p/7535857.html
Copyright © 2011-2022 走看看