看一道填空题
1.在一棵具有K层的满三叉树中,结点总数为( )
2.将有关二叉树的概念推广到三叉树,则一棵有244个结点的完全三叉树的高度是 ( )
第一题:
第k层的总数为:(因为从1开始,每次)其实若是满n叉数,k层
按同样方法可得
证明过程不展示了,其实就是等比数列求和
第二题:
有了第一题的基础就较为简单了那很明显,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);
}