class Solution {
public:
//用来判断是否找到节点
bool flag = false;
//dfs遍历得到路径,递归遍历,也就是先序遍历根左右
//传入参数:节点,容器,要找的值
void dfs(TreeNode* root, vector<int> & path, int o)
{
//判断根节点的值是否是要找的那个,或者是叶子节点
if(flag || root == NULL)
return ;
//将根节点加入容器,判断根节点是否是要找的那个节点,然后遍历左右子树
path.push_back(root->val);
if(root->val == o)
{
flag = true;
return ;
}
dfs(root->left, path, o);
dfs(root->right, path, o);
//如果找到那个节点,就返回,如果没有找到就回溯,将最后加入的那个节点从容其中删除
if(flag)
return ;
path.pop_back();
}
int lowestCommonAncestor(TreeNode* root, int o1, int o2) {
// write code here
//思路:利用dfs遍历找到两个节点的路径,然后比较路径
//找到最后一个相同的节点值即是最近的公共祖先
//用vector容器来存储路径
vector<int> path1, path2;
//dfs遍历得到路径
dfs(root,path1,o1);
flag = false;
dfs(root,path2,o2);
int res; //res用来接收最近公共祖先
//遍历两个路径,找到最后一个相同的节点值
for(int i = 0; i < path1.size() && i < path2.size(); i++)
{
if(path1[i] == path2[i])
res = path1[i];
else
break;
}
return res;
}
};
标签:遍历,int,dfs,JZ86,path1,二叉树,root,节点
From: https://www.cnblogs.com/H43724334/p/18148221