OJ_顺序存储的二叉树

该篇文章详细描述了一个用C++编写的算法,用于计算给定节点n在满二叉树中的层次编号,通过层次遍历和条件判断确定根节点m所在的层数以及最终的节点位置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题干

请在此处添加图片说明

C++实现

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>

using namespace std;

int main() {
	int m, n;
	while (1) {
		scanf("%d%d", &m, &n);
		if (m == 0 && n == 0) {
			break;
		}

		int i = 1;//获取层数,从1开始
		int begin_level;//存储子树的根(m)在第几层
		int final_level;//存储输入最后结点n后的大树还有几层

		//第i层结点的序号范围:2^(i-1) - 2^i-1
		//1左移i位 等价于 2^i
		//这个while循环用来获取begin_level和final_level
		while (1) {
			if (m >= 1 << (i - 1) && m < 1 << i) {
				begin_level = i;
			}
			if (n >= 1 << (i - 1) && n < 1 << i) {
				final_level = i;
				break;
			}
			++i;
		}

		int left = m;//m是子树的根
		int right = m;
		
		for (i = begin_level; i < final_level; i++)
		{
			left = 2 * left;//左子树
			right = 2 * right + 1;//右子树
		}

		int treenum;
		if (left > n) {//说明实际的最左最右孩子在大树的倒数第二层
			treenum = (1 << (final_level - begin_level)) - 1;
		}
		else if (n < right) {//右子树残缺,要从left走到n
			treenum = (1 << (final_level - begin_level)) - 1;
			treenum += n - left + 1;
		}
		else {//是满二叉树
			treenum = (1 << (final_level - begin_level) + 1) - 1;
		}
		cout << treenum << endl;
	}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

frostmelody

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值