高频算法面试题学习总结----树形结构2:共同祖先

题目:有个二叉树,还有俩节点,如何找得到,最近的祖先

输入:
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所示。此方法也可用于多个节点求最近祖先。

图1 

思路2:思路1的返回值是一个pair,包括value与ct。做进一步优化,只返回value:如图2,对于每个节点有左子树返回值left,右子树返回值right,及自身值self,这三个值中有一个与value匹配,则返回匹配值,有两个匹配,则返回节点自身值,若没有匹配则返回-1。

图2

 代码实现:

#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;
}

箴言录

凡事预则立,不预则废。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值