题目很好理解,即求一棵二叉树中两个节点的公共祖先。
我的解题思路是使用DFS,求出从根节点到两个待查节点各自的路径,然后从头开始比较两个路径,最后一个相等的节点即为公共祖先节点。完整代码如下。
class Solution {
public:
//DFS代码
void findNode(TreeNode* root, TreeNode* toFind, vector<TreeNode*> &curPath, bool& find){
if(root -> val == toFind -> val){
curPath.push_back(root);
find = true;
return;
}
if(root == nullptr)
return;
curPath.push_back(root);
if(root -> left != nullptr){
findNode(root -> left, toFind, curPath, find);
if(find == true)
return;
curPath.pop_back();
}
if(root -> right != nullptr){
findNode(root -> right, toFind, curPath, find);
if(find == true)
return;
curPath.pop_back();
}
}
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
//路径放在两个vector中
vector<TreeNode*> pPath, qPath;
TreeNode* result;
bool pFind = false, qFind = false;
//查找两个路径
findNode(root, p, pPath, pFind);
findNode(root, q, qPath, qFind);
if(qFind == false || pFind == false)
return nullptr;
//从得到的路径查找公共祖先
for(int index = 0; index < pPath.size() && index < qPath.size() && qPath[index] -> val == pPath[index] -> val; index++){
result = pPath[index];
}
return result;
}
};