以括号形式输出二叉树
输入一个二叉树的先序串,输出以括号形式表示的而叉树。如果结点的子树为空,先序串的对应位置为空格符。
Input
第1行:先序串 (结点数≤26,以单个大写字母表示)
Output
第1行:二叉树的括号形式
Sample Input
AB C D
Sample Output
A(B( ,C( , )),D( , ))
Code
#include<cstdio>
#include<cstring>
char s[100];
int len,x;
void dg()
{
printf("%c",s[x]);
if(s[x]==' ')return;
printf("(");
x++;
dg();
printf(",");
x++;
dg();
printf(")");
}
int main()
{
gets(s);
len=strlen(s);
dg();
return 0;
}
由于这里只讲二叉树,所以没有多叉树的遍历,但我推荐一个博客,里面面有多叉树的遍历方法(其实多叉树和二叉树的遍历差不多)。
多叉树的遍历
二叉树的遍历
给出一棵二叉树,分别输出先序、中序、后序遍历结果。
Input
第1行:结点数n(1<=n<=100)
以下若干行,每行3个整数,分别表示父结点、左孩子、右孩子。若没有孩子,对应的整数为0.
Output
第1行:树根
第2行:先序遍历结果,数字间用1个空格分开。
第3行:中序遍历结果,数字间用1个空格分开。
第4行:后序遍历结果,数字间用1个空格分开。
Smple Input
8
1 2 4
2 0 0
4 8 0
3 1 5
5 6 0
6 0 7
8 0 0
7 0 0
Sample Output
3
3 1 2 4 8 5 6 7
2 1 8 4 3 6 7 5
2 8 4 1 7 6 5 3
Code
#include<cstdio>
int n,root,ll;//ll行末多余空格,root根节点
struct shu
{
int p,l,r;
//p存父亲,l存左儿子,r存右儿子
}t[105];
void first(int x)
{
if(x==0)return;//没有儿子(叶节点)
ll++;
if(ll==n) printf("%d\n",x);//行末
else printf("%d ",x);
first(t[x].l);//递归左儿子
first(t[x].r);//递归右儿子
}
void middle(int x)
{
if(x==0)return;
middle(t[x].l);//递归左儿子
ll++;
if(ll==n) printf("%d\n",x);
else printf("%d ",x);
middle(t[x].r);//递归右儿子
}
void last(int x)
{
if(x==0)return;
last(t[x].l);
last(t[x].r);
ll++;
if(ll==n) printf("%d\n",x);
else printf("%d ",x);
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
t[y].p=t[z].p=x;//预处理
t[x].l=y;
t[x].r=z;
}
for(int i=1;i<=n;i++)//找根节点
if(t[i].p==0) root=i;
printf("%d\n",root);
first(root);ll=0;//先序
middle(root);ll=0;//中序
last(root);//后序
return 0;
}
求二叉树的深度
给出一棵二叉树,求该二叉树的深度。
Input
第一行给出节点个数n。(n<100)
接下来n行,每行给出两个数。依次表示节点1到节点n的左儿子和右儿子。如果左儿子为0,表示没有左儿子,如果右儿子为0,表示没有右儿子
Output
一个整数,表示二叉树的深度。
Sample Input
7
2 3
4 5
6 7
0 0
0 0
0 0
0 0
Sample Output
3
Code
#include<cstdio>
int n,ans,rot,mx=-1;//mx存树的深度,ans存递归时节点深度
struct shu
{
int l,r,p;//储存二叉树
}a[105];
void ser(int x,int ans)//递归求深度
{
if(x==0)return;//倒底之后返回
if(ans>mx)mx=ans;//存最大深度,因为那才是树的深度
ser(a[x].l,ans+1);//左子树
ser(a[x].r,ans+1);//右子树
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d%d",&a[i].l,&a[i].r);//存儿子
a[a[i].l].p=a[a[i].r].p=i;//存父亲
}
for(int i=1;i<=n;i++)
if(!a[i].p){rot=i;break;}//存根节点
ser(rot,1);//求深度
printf("%d\n",mx);
return 0;
}