题解
方法:DFS Search
找两个节点的最低祖宗节点,想到用深度优先搜索,先找到从根节点到达该节点的路径,然后遍历两条路径,找到最低的共同祖宗节点。可以通过测试。
然后后来发现我把问题复杂化了,忽略了题目中的条件,“平衡二叉树”,也就是说,节点是有顺序的,而我完全没有用上。
class Solution {
public:
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
vector<TreeNode*> arr1, arr2, ret1, ret2;
search(root, p, arr1, ret1);
search(root, q, arr2, ret2);
int i = 0;
while(i < ret1.size() && i < ret2.size() && ret1[i] == ret2[i]) {
i++;
}
if(i > 0) i--;
return ret1[i];
}
void search(TreeNode* node, TreeNode* t, vector<TreeNode*>& arr, vector<TreeNode*>& ret) {
if(!node) return;
arr.push_back(node);
if(node == t) {
for(auto n : arr) {
ret.push_back(n);
}
return;
}
if(node->left) search(node->left, t, arr, ret);
if(node->right) search(node->right, t, arr, ret);
arr.pop_back();
}
};
方法:平衡二叉树搜索
这里while的判断条件设置地很巧妙,只需要判断与root的值的差是不是同为正或同为负,那么就可以知道,p和q是不是都在root左边或者右边。如果不是,无论是等于0的情况还是,小于0的情况,都找到了共同祖先。
class Solution {
public:
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
while((root->val - p->val)*(root->val - q->val) > 0) {
root = (root->val > p->val) ? root->left : root->right;
}
return root;
}
};