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; }