LCA of a Binary Tree

236. Lowest Common Ancestor of a Binary Tree

 

 

 1     /**
 2      * 基础版
 3      * 给定p,q都是在树中
 4      * 有两种情况:
 5      *   1. p和q分布在LCA的两侧
 6      *   2. p和q在同一侧(p是q的祖先 或者是 q是p的祖先)
 7      * 先考虑第一种情况,例如:
 8      *                  1
 9      *                 / \
10      *                2   4
11      * 2和4的LCA是1,向下递归返回时,2返回2,4返回4,1接受到的left和right的返回值都存在值,那么就返回自己
12      * 也就是说=> 只要找到目标节点,就往上返回该节点
13      * ---------------------------------
14      * 第二种情况,例如:
15      *              1
16      *             /
17      *            2
18      *             \
19      *              3
20      * 2和3的LCA是2,2接收到的是3,而自己也是目标节点,那么就返回自己
21      * --------------注意1----------------
22      * 不用考虑在1处,只有一个返回值,如何判断是否有效。因为:两个节点必定在树中,如果root接收到一个值,那么就表示root之下就有p和q的LCA
23      * 如果接收到两个值,那么自己就是LCA
24      * --------------注意2----------------
25      * Corner case: p就是root 或者 q就是root
26      */
27     public static TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
28         // base case:
29         // 如果当前结点(root)是p或者是q,就返回自己
30         if (root == null || root == p || root == q) {
31             return root;
32         }
33 
34         TreeNode leftNode = lowestCommonAncestor(root.left, p, q);
35         TreeNode rightNode = lowestCommonAncestor(root.right, p, q);
36 
37         if (leftNode != null && rightNode != null) {    // 接收到两个值,返回root
38             return root;
39         } else if (leftNode != null && rightNode == null) { // 接收到一个值,就返回该node
40             return leftNode;
41         } else {
42             return rightNode;
43         }
44     }

 

posted @ 2016-06-03 14:25  十万片晶矿  阅读(184)  评论(0编辑  收藏  举报