1、假设二叉树的结点值是字符型,根据输入的一棵二叉树的完整先序遍历序列(子树空用’#’表示),建立一棵以二叉链表存储表示的二叉树。
2、对二叉树进行先序、中序和后序遍历操作,并输出遍历序列,观察输出的序列是否与逻辑上的序列一致。
3、主程序中要求设计一个菜单,允许用户通过菜单来多次选择执行哪一种遍历操作。
样例可以自己造一些试试,我试的:
abd###ce##f#g##
这个构造的二叉树如下:
#include <iostream>
using namespace std;
struct node{
char c;
node* lp;
node* rp;
};
typedef node* nptr;
void creattree(nptr& t){
char temp;
cin>>temp;
if(temp=='#') t=NULL;
else{
t=new node;
t->c=temp;
t->lp=NULL;
t->rp=NULL;
creattree(t->lp);
creattree(t->rp);
}
return;
}
void preorder(nptr t){
if(t==NULL) return;
cout<<t->c<<' ';
preorder(t->lp);
preorder(t->rp);
return;
}
void inorder(nptr t){
if(t==NULL) return;
inorder(t->lp);
cout<<t->c<<' ';
inorder(t->rp);
return;
}
void postorder(nptr t){
if(t==NULL) return;
postorder(t->lp);
postorder(t->rp);
cout<<t->c<<' ';
return;
}
int main(){
nptr head=NULL;
cout<<"请输入一个二叉树:"<<endl;
creattree(head);
while(1){
cout<<"请选择你要执行的命令:\n0.结束操作\n1.先序遍历\n2.中序遍历\n3.后序遍历\n";
int oo;
cin>>oo;
switch(oo){
case 0:return 0;
case 1:preorder(head);cout<<endl;break;
case 2:inorder(head);cout<<endl;break;
case 3:postorder(head);cout<<endl;break;
}
}
}
参考案例代码如下
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 30
#define NULL 0
#define ok 1
#define overflow -2
typedef char ElemType;
typedef struct BiTreeNode
{
ElemType data;
struct BiTreeNode *LChild,*RChild; //队头指针,队尾指针;
int height; //二叉树高度
}BiTreeNode,*BiTree;
//先序建立二叉树
void InitBiTree(BiTree &T)
{
return;
}
BiTree CreateBiTree( char *str,int i,int m)
{
BiTree p;
if(i>=m){
return NULL;}
p=new BiTreeNode;
p->data=str[i];
printf("%c",p->data);
p->LChild=CreateBiTree(str,2*i+1,m); //创建结点左子树
p->RChild=CreateBiTree(str,2*i+2,m); //创建结点右子树
return p;
}
//访问
void visit(char c)
{
printf("the node is :%c\n",c);
}
//先序遍历二叉树
void PreOrder(BiTree T)
{
if(T!=NULL)
{
visit(T->data); //访问根结点
PreOrder(T->LChild); //先序遍历左子树
PreOrder(T->RChild); //先序遍历右子树
}
}
//中序遍历二叉树
void InOrder(BiTree T)
{
if(T!=NULL)
{
InOrder(T->LChild); //中序遍历左子树
visit(T->data); //访问根结点
InOrder(T->RChild); //中序遍历右子树
}
}
//后序遍历二叉树
void PostOrder(BiTree T)
{
if(T!=NULL)
{
PostOrder(T->LChild); //后序遍历左子树
PostOrder(T->RChild); //后序遍历右子树
visit(T->data); //访问根结点
}
}
//统计结点个数
int PreOrderCount(BiTree pointer)
{
int count=0;
if(pointer==NULL) return NULL;
else {
count++;
PreOrderCount(pointer->LChild); //先序遍历左子树
PreOrderCount(pointer->RChild); //先序遍历右子树
}
return count;
}
void main()
{
int i,n;
char str[MAXSIZE];
BiTree root;
//int a,height=0;
int select;
do {
printf("\n frist be use must be initiated !\n");
printf("please choose (0--7):\n");
printf("====================menu==========\n");
printf(" 1 to initBiTree \n");
printf(" 2 to CreateBiTree \n");
printf(" 3 to PreOrder \n");
printf(" 4 to InOrder\n");
printf(" 5 to PostOrder \n");
//printf(" 6 the NoderHeight \n");
printf(" 0 exit \n");
printf("\n======================================\n");
scanf("%d",&select);
switch(select)
{
case 1:
{ system("cls");
InitBiTree(root);
printf("the bitree have been initated!\n");
break;
}
case 2:
{ system("cls");
printf("please input a BiTree node num:\n");
scanf("%d",&n);
getchar(); // 接收上一下语句scanf后的回车符
printf("please input a string which length is %d:",n);
for(i=0;i<n;i++)
str[i]=getchar();
printf("\n\n");
root=CreateBiTree(str,0,n);
printf(" the tree is already creat\n");
break;
}
case 3:
{ system("cls");
printf("preorder traverse\n");
PreOrder(root);
break;
}
case 4:
{ system("cls");
printf("Inorder traverse\n");
InOrder(root);
break;
}
case 5:
{ system("cls");
printf("PostOrder traverse\n");
PostOrder(root);
break;
}
case 0: exit(0);
}
}while(select<=8);
}
中序遍历
void InOrder(BtNode* ptr)
{
if (ptr != nullptr)
{
InOrder(ptr->leftchild);
cout << ptr->data << " ";
InOrder(ptr->rightchild);
}
}
前序遍历
void PreOrder(BtNode* ptr)
{
if (ptr != nullptr)
{
cout << ptr->data << " ";
PreOrder(ptr->leftchild);
PreOrder(ptr->rightchild);
}
}
后续遍历
void PassOrder(BtNode* ptr) //
{
if (ptr != nullptr)
{
PassOrder(ptr->leftchild);
PassOrder(ptr->rightchild);
cout << ptr->data << " ";
}
}