求完全二叉树中的最近公共祖先(数组形式存放节点)

完全二叉树的最近公共祖先

题目描述

完全二叉树采用数组存放,在数组中找到v1和v2的最近公共祖先

思路

将数组的索引当做二叉树的节点,当前节点为root,其左子树为left = root * 2 + 1;右子树为 right = left + 1;,

递归三部曲

  • 返回值和参数:输入当前的数组以及起始点root = 0,两个节点值v1和v2,输出v1和v2的最近公共祖先
  • 单层递归逻辑:当前节点等于v1或者v2时返回当前节点,当前节点不为v1或者v2,遍历它的左子树和右子树,如果左子树返回-1,说明v1和v2在右子树中,反之在左子树中,如果一个在左一个在右,则当前节点就是他们的最近公共祖先
  • 终止递归条件:当前左右子树大于或者等于数组的大小
int backTrace(vector<int>& vec,int root, int v1, int v2)
{
	if (root >= vec.size())
		return -1;
	if (vec[root] == v1 || vec[root] == v2)
		return root;
	int left = backTrace(vec, root * 2 + 1, v1, v2);
	int right = backTrace(vec, root * 2 + 2, v1, v2);
	if (left == -1) return right;
	if (right == -1) return left;
	return root;
}
int main()
{

	vector<int> vec{ 1,2,3,4,5,6,7,8,9 };
	int res = backTrace(vec, 0, 5, 6);
	cout << vec[res];
   	cout << endl;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值