class Solution {
public:
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
p_father.clear();
q_father.clear();
//为两个目标节点寻找father
findFather(root, p, 0);
findFather(root, q, 1);
//将得到的father组进行对比,因为是dfs从目标节点开始回溯添加father
//所以从vector第一个元素开始搜索即可得到最小的祖先
for (int i = 0; i < p_father.size(); i++) {
for (int j = 0; j < q_father.size(); j++) {
if (p_father[i] == q_father[j])
return p_father[i];
}
}
}
private:
//p_father向量用于保存p的father
//q_father向量用于保存q的father
vector<TreeNode*> p_father;
vector<TreeNode*> q_father;
//使用DFS从根开始搜索,若找到目标节点,则从目标节点开始回溯,并将father逐个加入向量中
bool findFather(TreeNode* root, TreeNode* target, bool p0Orq1) {
if (root != nullptr) {
if (root == target) {
if (p0Orq1) q_father.push_back(root);
else p_father.push_back(root);
return true;
}
bool leftFound = findFather(root->left, target, p0Orq1);
if (leftFound) {
if (p0Orq1) q_father.push_back(root);
else p_father.push_back(root);
return true;
}
bool rightFound = findFather(root->right, target, p0Orq1);
if (rightFound) {
if (p0Orq1) q_father.push_back(root);
else p_father.push_back(root);
return true;
}
}
return false;
}
};
算法分析与设计第六周:236. Lowest Common Ancestor of a Binary Tree
最新推荐文章于 2017-06-26 14:19:47 发布