236. Lowest Common Ancestor of a Binary Tree**

来源:互联网 发布:电信网络电视要收费吗 编辑:程序博客网 时间:2024/06/05 02:48

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.

My code:

/** * Definition for a binary tree node. * public class TreeNode { *     int val; *     TreeNode left; *     TreeNode right; *     TreeNode(int x) { val = x; } * } */public class Solution {    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {        if(root==null) return null;        while(root!=null){            if (isAncestor(root.left,p)&&isAncestor(root.left,q)) root=root.left;            else if (isAncestor(root.right,p)&&isAncestor(root.right,q)) root=root.right;            else return root;        }        return root;    }    private boolean isAncestor(TreeNode root, TreeNode p){        if(root==null) return false;        return root==p||isAncestor(root.left,p)||isAncestor(root.right,p);    }}
总结:时间复杂度太高,超时了。isAncestor每次只是检查是不是ancestor,而没有检查是不是lowestAncestor。再加上while循环,每个结点都会被上方的节点访问。

Reference:

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

Iterative:

public class Solution {    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {        Map<TreeNode, TreeNode> parent = new HashMap<>();        Deque<TreeNode> stack = new ArrayDeque<>();        parent.put(root, null);        stack.push(root);        while (!parent.containsKey(p) || !parent.containsKey(q)) {            TreeNode node = stack.pop();            if (node.left != null) {                parent.put(node.left, node);                stack.push(node.left);            }            if (node.right != null) {                parent.put(node.right, node);                stack.push(node.right);            }        }        Set<TreeNode> ancestors = new HashSet<>();        while (p != null) {            ancestors.add(p);            p = parent.get(p);        }        while (!ancestors.contains(q))            q = parent.get(q);        return q;    }}



0 0
原创粉丝点击