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