题目:
给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。
百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”
例如,给定如下二叉树: root = [3,5,1,6,2,0,8,null,null,7,4]
代码实现:
class Solution {
public:
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
if(root == nullptr || p == nullptr || q == nullptr)
return nullptr;
list<TreeNode*> path1;
GetNodePath(root, p, path1);
list<TreeNode*> path2;
GetNodePath(root, q, path2);
return CommonNode(path1, path2);
}
bool GetNodePath(TreeNode* root, TreeNode* node, list<TreeNode*>& path)
{
//先把root节点加入到list中
path.push_back(root);
//找到目标节点
if (root == node) return true;
//标志符found
bool found = false;
if (!found && root->left != NULL) found = GetNodePath(root->left, node, path);
if (!found && root->right != NULL) found = GetNodePath(root->right, node, path);
//如果没有找到,则返回头节点时,删除当前节点
if (!found)
{
path.pop_back();
}
return found;
}
TreeNode* CommonNode(list<TreeNode*> path1, list<TreeNode*> path2)
{
list<TreeNode*>::iterator iter_1 = path1.begin();
list<TreeNode*>::iterator iter_2 = path2.begin();
TreeNode* result = nullptr;
while(iter_1 != path1.end() && iter_2 != path2.end())
{
if(*iter_1 == *iter_2)
result = *iter_1;
iter_1++;
iter_2++;
}
return result;
}
};