求二叉树两个节点的最小公共父节点
思路:
有两种情况,一是要找的这两个节点(p, q),在我遍历的这个节点(r)的两侧,那么我这个节点就是这
两个节点的最小公共父节点;二是节点在同一侧,则 r->left 或者 r->right 为 NULL,另一边返回p或者q,
那么另一边返回的就是他们的最小公共父节点。
递归有两个出口,一是没有找到p或者q,则返回NULL;二是只要碰到p或者q,就立刻返回。
参考资料:
[1] http://www.leetcode.com/2011/07/lowest-common-ancestor-of-a-binary-tree-part-i.html
代码:
View Code
1 //求两个节点的最小公共父节点(Lowest Common Ancestor of a Binary Tree) 2 BinaryTreeNode * LCA(BinaryTreeNode *root, BinaryTreeNode * p, BinaryTreeNode * q) 3 { 4 if(!root) return NULL; 5 if(root == p || root == q) return root; 6 BinaryTreeNode * left = LCA(root->m_pLeft, p, q); 7 BinaryTreeNode * right = LCA(root->m_pRight, p, q); 8 if(left && right) return root; 9 return left ? left : right; 10 }