标签:
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.
可以采用Divide&conquer。
思路:1.将问题变为寻找以左子树为根节点的LCA 和 以右子树为根节点的LAC。
2.如果以左子树为根节点的LCA 和 以右子树为根节点的LAC都存在表明,该节点的左孩子和右孩子是p 和 q ,因此LCA为左右子树的根节点。
3.如果以左子树为根节点的LCA为空,以右子树为根节点的LAC不为空,则返回右子树为根节点的LCA。
4.如果以右子树为根节点的LCA为空,以左子树为根节点的LAC不为空,则返回左子树为根节点的LCA。
5.如果以左子树为根节点的LCA 和 以右子树为根节点的LAC都不存在返回null.
1 /** 2 * Definition for a binary tree node. 3 * public class TreeNode { 4 * int val; 5 * TreeNode left; 6 * TreeNode right; 7 * TreeNode(int x) { val = x; } 8 * } 9 */ 10 public class Solution { 11 public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) { 12 if (root == null || p == null || q == null) { 13 return null; 14 } 15 if (p == root || q == root) { 16 return root; 17 } 18 //Divide 19 TreeNode left = lowestCommonAncestor(root.left, p, q); 20 TreeNode right = lowestCommonAncestor(root.right, p, q); 21 //Conquer 22 if (left != null && right != null) { 23 return root; 24 } 25 if (left == null && right != null) { 26 return right; 27 } 28 if (left != null && right == null) { 29 return left; 30 } 31 return null; 32 } 33 }
Lowest Common Ancestor of a Binary Tree
标签:
原文地址:http://www.cnblogs.com/FLAGyuri/p/5271192.html