bt是一颗二叉树,如下图所示:
要求实现如下函数:
- void CreateBTree(BTree &bt,string str);//根据输入的字符串,创建二叉树。(可根据课本括号法建树。)
- void DispBTree(BTree bt);//括号法输出二叉树
- void PreOrder( BTree bt );//先序遍历二叉树
- void InOrder(BTree bt);//中序遍历二叉树
- void PostOrder(BTree bt);//后序遍历二叉树
- void LevelOrder(BTree bt);//层次遍历二叉树
###数据结构定义:
typedef struct node *BTree;
typedef struct node{
char data;
BTree lchild;
BTree rchild;
}TNode;
函数接口定义:
void CreateBTree(BTree &bt,string str);//创建二叉树
void DispBTree(BTree bt);//括号法输出二叉树
void PreOrder( BTree bt );//先序遍历二叉树
void InOrder(BTree bt);//中序遍历二叉树
void PostOrder(BTree bt);//后序遍历二叉树
void LevelOrder(BTree bt);//层次遍历二叉树
其中 BTree
表示二叉树类型。 str
是传入的字符串 ,类型为 C++
中 string
类。
裁判测试程序样例:
#include<iostream>
#include <string>
#include <stack>
#include <queue>
using namespace std;
typedef struct node *BTree;
typedef struct node{
char data;
BTree lchild;
BTree rchild;
}TNode;
void CreateBTree(BTree &bt,string str);//创建二叉树
void DispBTree(BTree bt);//括号法输出二叉树
void PreOrder( BTree bt );//先序遍历二叉树
void InOrder(BTree bt);//中序遍历二叉树
void PostOrder(BTree bt);//后序遍历二叉树
void LevelOrder(BTree bt);//层次遍历二叉树
int flag=0;
int main()
{
string str;
BTree bt,p;
str="A(B(D,F(E)),C(G(,H),I))";
CreateBTree(bt,str);
cout<<"btree:";
DispBTree(bt);
cout<<endl<<"preorder:";
PreOrder(bt);
flag=0;
cout<<endl<<"inorder:";
InOrder(bt);
flag=0;
cout<<endl<<"postorder:";
PostOrder(bt);
flag=0;
cout<<endl<<"levelorder:";
LevelOrder(bt);
}
/* 请在这里填写答案 */
###输出说明:
- 第一行括号法输出二叉树所有节点。
- 第二行输出先序遍历树中所有节点,要求节点间空格隔开,最后一个节点尾部无空格。
- 第三行输出中序遍历树中所有节点,要求节点间空格隔开,最后一个节点尾部无空格。
- 第四行输出后序遍历树中所有节点,要求节点间空格隔开,最后一个节点尾部无空格。
- 第五行输出层次遍历树中所有节点,要求节点间空格隔开,最后一个节点尾部无空格。
输出样例:
btree:A(B(D,F(E)),C(G(,H),I))
preorder:A B D F E C G H I
inorder:D B E F A G H C I
postorder:D E F B H G I C A
levelorder:A B C D F G I E H
c++实现:
int t1,t2,t3,t4;
void CreateBTree(BTree &bt,string str){
stack<BTree> s;
int k, i=0;
BTree t;
bt=NULL;
char ch=str[i];
while (i<str.size())
{
switch (ch){
case '(':s.push(t);k=1;break;
case ')':s.pop();break;
case ',':k=2;break;
default:
t = (BTree)malloc(sizeof(BTree));
t->data = ch;
t->lchild = t->rchild = NULL;
if (bt == NULL) bt=t;
else{
switch (k){
case 1:s.top()->lchild = t; break;
case 2:s.top()->rchild = t; break;
}
}
}
i++;
ch = str[i];
}
}
void DispBTree(BTree bt){
if(bt){
printf("%c",bt->data);
if(bt->lchild || bt->rchild)
{
printf("(");
DispBTree(bt->lchild);
if(bt->rchild) printf(",");
DispBTree(bt->rchild);
printf(")");
}
}
}
void PreOrder( BTree bt ){
if(bt){
if (t1++ == 0) printf("%c",bt->data);
else printf(" %c",bt->data);
PreOrder(bt->lchild);
PreOrder(bt->rchild);
}
}
void InOrder(BTree bt){
if(bt){
InOrder(bt->lchild);
if (t2++ == 0) printf("%c",bt->data);
else printf(" %c",bt->data);
InOrder(bt->rchild);
}
}
void PostOrder(BTree bt){
if(bt){
PostOrder(bt->lchild);
PostOrder(bt->rchild);
if (t3++ == 0) printf("%c",bt->data);
else printf(" %c",bt->data);
}
}
void LevelOrder(BTree bt){
queue<BTree> q;
BTree t;
if(!bt) return;
q.push(bt);
while(!q.empty()){
t=q.front();
q.pop();
if (t4++ == 0) printf("%c",t->data);
else printf(" %c",t->data);
if(t->lchild) q.push(t->lchild);
if(t->rchild) q.push(t->rchild);
}
}