题目描述
树形结构是一类重要的非线性数据结构,其中以树和二叉树最为常用。对于每一个结点至多只有两课子树的一类树,称其为二叉树。二叉树的链式存储结构是一类重要的数据结构,其形式定义如下:
而二叉树的前序、中序遍历是非常重要的能够访问二叉树所有结点的算法,下面分别列出一种先序遍历和两种中序遍历的算法。
第一种中序遍历的方法(算法6.3):
第二种中序遍历的方法(算法6.2):
通过读入一个字符串,建立二叉树的算法如下:
在本题中,将会给出一个按照先序遍历得出的字符串,空格代表空的子节点,大写字母代表节点内容。请通过这个字符串建立二叉树,并按照题目描述中的一种先序遍历和两种中序遍历的算法分别输出每一个非空节点。
输入
输入只有一行,包含一个字符串S,用来建立二叉树。保证S为合法的二叉树先序遍历字符串,节点内容只有大写字母,且S的长度不超过100。
输出
共有三行,每一行包含一串字符,表示分别按先序、中序、中序得出的节点内容,每个字母后输出一个空格。请注意行尾输出换行。
样例输入
ABC DE G F
样例输出
A B C D E G F C B E G D F A C B E G D F A
代码:
#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<cstring>
using namespace std;
const int maxn=110;
struct Node{
char data;//根植
int xu;
Node *left;//左孩子
Node *right;//右孩子
};
int flag;
void in(Node *&T)
{// 注意:此处的输入和建树方式
if(flag) return ;
char t;
t=getchar();//输入一个字符
if(t==' ')
{//如果为空格,则根节点为空
T=NULL;
}
else if(t=='\n')
{//遇到换行符,结束操作
flag=1;
return ;
}
else
{//否则就是赋值
T=new Node;//新建一个结点
T->data =t;//给这个结点赋值
in(T->left );//左孩子
in(T->right );//右孩子
}
}
void xian(Node *T)
{//先序遍历
if(T)
{
cout<<T->data <<" ";//输出根结点的值
xian(T->left );//遍历左孩子
xian(T->right );//遍历右孩子
}
}
void zhong(Node *T)
{//中序遍历
if(T)
{//如果不为空树
zhong(T->left );//遍历左孩子
cout<<T->data <<" ";//输出根结点的值
zhong(T->right );//遍历右孩子
}
}
int main()
{
flag=0;
Node *T;
in(T);//建立一个二叉树
xian(T);//先序遍历输出
cout<<endl;
zhong(T);//中序遍历输出
cout<<endl;
zhong(T);
cout<<endl;
return 0;
}
来源:CSDN
作者:韩小妹
链接:https://blog.csdn.net/hanyue0102/article/details/81414101