二叉树题解

看一道填空题

1.在一棵具有K层的满三叉树中,结点总数为(          ) 

2.将有关二叉树的概念推广到三叉树,则一棵有244个结点的完全三叉树的高度是 (         )

第一题:
第k层的总数为:3^{k-1}
(因为从1开始,每次\times 3)

\\ T \ =3^0+3^1+3^2+......+3^{k-1} \\ 3T= \ \ \ \ \ \ 3^1+3^2+......+3^{k-1} +3^k \\ 2T=3^k-3^0 \\ T=\frac{3^k-1}{2}

其实若是满n叉数,k层

按同样方法可得

T=\frac{n^k-1}{n-1}

证明过程不展示了,其实就是等比数列求和

第二题:
有了第一题的基础就较为简单了

\\ \frac{3^k-1}{2}\le244 \\Question:k_{max}+1

那很明显,Ans=6

来看一道关于扩展二叉树的题

由于先序、中序和后序序列中的任一个都不能唯一确定一棵二叉树,所以对二叉树做如下处理,将二叉树的空结点用·补齐,如图所示。

我们把这样处理后的二叉树称为原二叉树的扩展二叉树,扩展二叉树的先序和后序序列能唯一确定其二叉树。

现给出扩展二叉树的先序序列,要求输出其中序和后序序列。

Format

Input

一个字符串,由大写字母和“.”组成,为扩展二叉树的先序序列,长度小于50。

Output

输出两行,第一行为中序序列,第二行为后序序列。

Samples

输入数据 1

ABD..EF..G..C..

输出数据 1

DBFEGAC
DFGEBCA

这题有一点难,来看分析

bt

本视频较长,挑重点看即可

#include<bits/stdc++.h>
using namespace std;
struct tree{
	int l,r;
	char num;
}tr[57];//树
char a[57];//输入
int cur;//树个数
int dfs(int i){//变成二叉树
//dfs(i)=以i为子树的根节点里都最大下标
	int now=++cur;//定义新数,now是下标
	tr[now].num=a[i];
	if(a[i]=='.'){return i;}//如果是叶子,就返回自己
	int id=dfs(i+1)+1;//右子树根节点下标
	tr[now].l=now+1;
	tr[now].r=cur+1;
	return dfs(id);//返回右子树最大下标
}
void mid(int id){
	if(tr[id].num=='.') return;//不是(!id) 
	mid(tr[id].l);
	cout<<tr[id].num;
	mid(tr[id].r);
}
void end(int id){
	if(tr[id].num=='.') return;
	end(tr[id].l);
	end(tr[id].r);
	cout<<tr[id].num;
}
int main(){
	cin>>a;
	dfs(0);
	mid(1);
	puts("");
	end(1);
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值