题目:有个二叉树,还有俩节点,如何找得到,最近的祖先
输入:
root = {1, 2, 3, -1, 4, 5, 6}
value1 = 5
value2 = 6
解释:
1
/ \
2 3
/\ /\
null 4 5 6
root对应的是一个树形结构,-1代表null,正整数代表这个节点的值,每个节点的值全局唯一。
输出:3
思路1:对二叉树进行DFS遍历,记录每个节点为根的子树有几个value记为ct,可能的返回值为0,1,2;找到返回值ct==2的最深的节点即为所求。如图1所示。此方法也可用于多个节点求最近祖先。
![](https://i-blog.csdnimg.cn/blog_migrate/49047542bba5eeb85b0d8aa31daa0ab6.png)
思路2:思路1的返回值是一个pair,包括value与ct。做进一步优化,只返回value:如图2,对于每个节点有左子树返回值left,右子树返回值right,及自身值self,这三个值中有一个与value匹配,则返回匹配值,有两个匹配,则返回节点自身值,若没有匹配则返回-1。
![](https://i-blog.csdnimg.cn/blog_migrate/03ad05194a922129e30e5c3cad19b11e.png)
代码实现:
#include<iostream>
#include<vector>
using namespace std;
int FindAncestor(vector<int>& root, int value1, int value2,int rt)
{
if (rt > root.size() - 1 || root[rt] == -1)
return -1;
if (root[rt] == value1 || root[rt] == value2)
return root[rt]; //若当前值匹配,则一定返回该值
int l = FindAncestor(root, value1, value2, 2 * rt + 1);
int r = FindAncestor(root, value1, value2, 2 * rt + 2);
//find 0 或 1
//若没匹配,返回-1
//若匹配1个,返回该匹配值
//二者都可描述为l+r+1
if (l == -1 || r == -1)
return l + r + 1;
//find 2
//有两个匹配,则返回节点自身值
else
return root[rt];
}
int main()
{
vector<int> root({ 1,2,3,-1,4,5,6 });
int value1 = 3;
int value2 = 2;
cout << FindAncestor(root, value1, value2, 0) << endl;
return 0;
}
箴言录
凡事预则立,不预则废。