暑假集训 8.8 sdut2136 数据结构实验之二叉树的建立与遍历

时间:2021-05-24 10:31:10


数据结构实验之二叉树的建立与遍历

Time Limit: 1000MS Memory limit: 65536K

题目描述

已知一个按先序序列输入的字符序列,如abc,,de,g,,f,,,(其中逗号表示空节点)。请建立二叉树并按中序和后序方式遍历二叉树,最后求出叶子节点个数和二叉树深度。

输入

输入一个长度小于50个字符的字符串。

输出

输出共有4行:
第1行输出中序遍历序列;
第2行输出后序遍历序列;
第3行输出叶子节点个数;
第4行输出二叉树深度。

示例输入

abc,,de,g,,f,,,

示例输出

cbegdfa
cgefdba
3
5

///简单的递归调用,当然可以转换为栈来构造二叉树,用栈会更好的理解二叉树构造....

///Accode

#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <queue>
using namespace std;

typedef char elemtype;
const int maxn=110;


typedef struct tree
{
elemtype data;
tree *lc; ///*leftchildren
tree *rc; ///*rightchildren
} tree,*Tree;
queue<Tree>q;

int i;

void Creat(Tree &T,char s[]) ///Preorder create a tree from s[];
{
i++;
char ch=s[i];
if (ch==',')
{
T=NULL;
}
else if (ch=='\0')
{
return ;
}
else
{
T=new tree;
T->data=ch;
Creat(T->lc,s);
Creat(T->rc,s);
}
}

int num;

void leaves(Tree &T) ///total leaves' number
{
if (T)/// T!=null so T->lc||T->rc is(are) exist;
{
if (!T->lc&&!T->rc)
{
num++;
}
else
{
leaves(T->lc);
leaves(T->rc);
}
}
}

int h,ans;

void high(Tree &T,int ans) ///total tree's high
{
if(!T) ///if T==null find the max deep
{
if (ans>=h)
{
h=ans;
}
return ;
}
high(T->lc,ans+1);
high(T->rc,ans+1);
}

void midout(Tree &T) ///middle print
{
if (T)
{
midout(T->lc);
cout<<T->data;
midout(T->rc);
}
}

void lastout(Tree &T) ///last print
{
if (T)
{
lastout(T->lc);
lastout(T->rc);
cout<<T->data;
}
}

int main()
{
char s[maxn];
int t;
cin>>t;
while (t--)
{
cin>>s;
i=-1;
num=0;
h=0;
ans=0; ///注意数据的 初始化
Tree T;

Creat(T,s);
cengciout(T);
}
return 0;
}