Description:
题目大意:在一个二叉树上给出两个点,找到他们的最近公共祖先。
解题思路:
算法标签:DFS
- DFS,求根节点到两个节点的路径 load1和 load2。
- 因为最近公共祖先的到根节点都相同,找到两个最后相同的点即为最近公共祖先。
代码:
/**
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
class Solution {
public:
// 标记是否找到目标节点
bool find = false;
void dfs(vector<int> & load, TreeNode* root , int target) {
// 如果已经找到目标节点
if(find || root == NULL)
return;
load.push_back(root -> val);
// 找到目标节点
if(root -> val == target) {
find = true;
return;
}
// 搜索左子树
dfs(load, root -> left, target);
// 搜索右子树
dfs(load, root -> right, target);
// 防止将节点去除
if(find)
return;
// 如果没找到,回溯
load.pop_back();
}
int lowestCommonAncestor(TreeNode* root, int o1, int o2) {
// 存储 o1 和 o2 两个路径上的节点
vector<int>load1,load2;
// o1 路径
dfs(load1, root , o1);
// 重置标记
find = false;
// o2 路径
dfs(load2, root , o2);
int size = min(load1.size(), load2.size());
// 寻找最后一个相等的节点,第一个节点一定相同,为根节点
for(int i = 1; i < size;i++) {
if(load1[i] != load2[i])
return load1[i - 1];
}
return load1[size - 1];
}
};