《算法笔记》9.2小节——数据结构专题(2)->二叉树的遍历->问题B:二叉树

问题 B: 二叉树

时间限制: 1 Sec  内存限制: 32 MB
提交: 528  解决: 272
[提交][状态][讨论版][命题人:外部导入]

题目描述

 


    如上所示,由正整数1,2,3……组成了一颗特殊二叉树。我们已知这个二叉树的最后一个结点是n。现在的问题是,结点m所在的子树中一共包括多少个结点。

    比如,n = 12,m = 3那么上图中的结点13,14,15以及后面的结点都是不存在的,结点m所在子树中包括的结点有3,6,7,12,因此结点m的所在子树中共有4个结点。

输入

输入数据包括多行,每行给出一组测试数据,包括两个整数m,n (1 <= m <= n <= 1000000000)。最后一组测试数据中包括两个0,表示输入的结束,这组数据不用处理。

输出

 对于每一组测试数据,输出一行,该行包含一个整数,给出结点m所在子树中包括的结点的数目。

样例输入

3 7
142 6574
2 754
0 0

样例输出

3
63
498

[提交][状态]

 

#include<cstdio>
int main(){
	int m,n;
	while(scanf("%d%d",&m,&n) && m!=0 && n!=0){
		//结点m,总结点数n 
		int a,b,level=1,sum=1;
		a=2*m;//a存储m的左子树结点 
		b=2*m+1;//b存储m的右子树结点 
		while(b<n){//如果右子树都比总结点数n小 
			level*=2;//n+1层总是n层结点数的2倍 
			sum+=level;//结点总数 
			a=a*2;//不断寻找其左子树 ,为最后一层“最小值” 
			b=b*2+1;//不断寻找其右子树,为 最后一层“最大值” 
		}//直到b大于等于n的时候,停止循环,接下来查找最后一层 
		if(a<=n){//说明最后一层仍有结点 
			sum+=(n-a+1);
		}
		printf("%d\n",sum);
	}
	
	return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于已知前序遍和中序遍结果,求后序遍结果的问题,可以通过递归的方式来解决。具体步骤如下: 1. 首先,根据前序遍的结果,确定根节点。前序遍的第一个元素即为根节点。 2. 然后,在中序遍的结果中找到根节点的位置,将中序遍结果分为左子树和右子树。 3. 根据左子树和右子树的长度,将前序遍结果分为左子树和右子树。 4. 递归地对左子树和右子树进行上述操作,得到左子树和右子树的后序遍结果。 5. 将左子树的后序遍结果和右子树的后序遍结果拼接在一起,并将根节点的值添加到最后,即得到整棵二叉树的后序遍结果。 下面是一个示例代码实现: ```python def get_postorder(preorder, inorder): if not preorder or not inorder: return [] root = preorder[0] root_index = inorder.index(root) left_inorder = inorder[:root_index] right_inorder = inorder[root_index+1:] left_preorder = preorder[1:len(left_inorder)+1] right_preorder = preorder[len(left_inorder)+1:] left_postorder = get_postorder(left_preorder, left_inorder) right_postorder = get_postorder(right_preorder, right_inorder) return left_postorder + right_postorder + [root] preorder = [1, 2, 4, 5, 7, 8, 3, 6] inorder = [4, 2, 7, 5, 8, 1, 3, 6] postorder = get_postorder(preorder, inorder) print(postorder) # 输出 [4, 7, 8, 5, 2, 6, 3, 1] ``` 通过以上代码,可以得到给定前序遍和中序遍结果后,求得的后序遍结果为 `[4, 7, 8, 5, 2, 6, 3, 1]`。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值