• Lowest Common Ancestor of a Binary Tree——Leetcode


    Given a binary tree, find the lowest common ancestor (LCA) of two given nodes in the tree.

    According to the definition of LCA on Wikipedia: “The lowest common ancestor is defined between two nodes v and w as the lowest node in T that has both v and w as descendants (where we allow a node to be a descendant of itself).”

            _______3______
           /              
        ___5__          ___1__
       /              /      
       6      _2       0       8
             /  
             7   4
    

    For example, the lowest common ancestor (LCA) of nodes 5 and 1 is 3. Another example is LCA of nodes 5 and 4 is 5, since a node can be a descendant of itself according to the LCA definition.

    题目大意:求二叉树的两个节点的最近祖先。

    解题思路:递归的来写,

    设两个变量left和right,如果在root节点的左右孩子节点分别发现节点p和q,

    那么假设left=q,right=p

    那么root就是最近祖先;

    如果left=null,right=q或p,那么right就是最近祖先;

    如果right=null,left=q或p,那么left就是最近祖先。

      public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
            if(root==null||root==q||root==p){
                return root;
            }
            TreeNode left = lowestCommonAncestor(root.left,p,q);
            TreeNode right = lowestCommonAncestor(root.right,p,q);
            if(left!=null&&right!=null){
                return root;
            }
            return left==null?right:left;
        }
        

     也看到有人用map记录父节点信息,然后利用map找出最近公共祖先,也不错。

    代码如下:

    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
        HashMap<TreeNode,TreeNode> m = new HashMap<TreeNode,TreeNode>();
        Queue<TreeNode> queue = new LinkedList<TreeNode>();
        queue.offer(root);
        while(queue.peek()!=null){
            TreeNode t = queue.poll();
            if(t.left!=null){
                m.put(t.left,t);
                queue.offer(t.left);
            }
            if(t.right!=null){
                m.put(t.right,t);
                queue.offer(t.right);
            }
        }
        Set<TreeNode> l = new HashSet<TreeNode>();
        TreeNode pp = p;
        while(pp!=root){
            l.add(pp);
            pp = m.get(pp);
        }
        l.add(root);
        TreeNode qq = q;
        while(!l.contains(qq)){
            qq = m.get(qq);
        }
        return qq;
    }
  • 相关阅读:
    【CF932F】Escape Through Leaf 启发式合并set维护凸包
    【CF932E】Team Work/【BZOJ5093】图的价值 数学+NTT
    【CF917D】Stranger Trees 树形DP+Prufer序列
    【CF914G】Sum the Fibonacci 快速??变换模板
    【CF772D】Varying Kibibits FWT
    【CF802C】Heidi and Library (hard) 费用流
    【CF802L】Send the Fool Further! (hard) 高斯消元
    【CF809D】Hitchhiking in the Baltic States Splay
    【CF815D】Karen and Cards 单调栈+扫描线
    【CF819D】Mister B and Astronomers EXGCD
  • 原文地址:https://www.cnblogs.com/aboutblank/p/4823714.html
Copyright © 2020-2023  润新知