LC236 Lowest Common Ancestor of a Binary Tree

这道题一个直观做法是对二叉树进行前序遍历,遍历时跟踪路径,当遍历到一个指定节点时,就把路径记下来。然后对比找到的两条路径,找出最后一个相同的节点。

另一个想法是,找到最小子树能够包含这两个节点。因此编程时可以考虑,如果找到了一个节点,就返回该节点,因为另一个节点如果在别的子树上,继续寻找就没有意义;如果在这棵子树上,则因为找到的节点就是根节点,所以返回的该节点就是最低公共祖先。

当然如果该树是二叉搜索树,就有更简便的方法。

 1 class Solution {
 2 public:
 3     TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
 4         if(root==NULL)
 5             return NULL;
 6         TreeNode* left = lowestCommonAncestor(root->left, p, q);
 7         TreeNode* right = lowestCommonAncestor(root->right, p, q);
 8         if(left!=NULL&&right!=NULL)
 9             return root;
10         if(root==p||root==q)
11             return root;
12         if(left!=NULL)
13             return left;
14         if(right!=NULL)
15             return right;
16         return NULL;
17     }
18 };

 

posted @ 2016-07-28 09:07  vaevaevae  阅读(179)  评论(0编辑  收藏  举报