实验内容:假设自上而下按层次,自左至右输入每个结点的一个三元组(N, P, L/R)。其中N为本结点的元素,P为其父结点,L指示N为P 的左孩子,R指示N为P的右孩子。试写一个建立二元树在内存的双链表示算法,并实现先根、中根、后根以及层序遍历算法。
样例输出(二选一):
a -1-1
b a L
g a R
c b L
d b R
h g L
e d L
f d R
-1
1 -1-1
2 1 L
3 1 R
4 2 L
5 2 R
6 3 L
7 3 R
8 4 L
9 4 R
10 6 R
11 7 L
-1
代码样例:
#include<stdio.h>
#include <stdlib.h>
#include<string>
#include<iostream>
using namespace std;
#define MAXSIZE 50
struct BinaryTree
{
int c;
struct BinaryTree * l, * r;
};
struct BinaryTree * Create_BiTree()/*二叉树的建立*/
{
int i,FA;
string LR;
struct BinaryTree *s,*t,*p[MAXSIZE];
printf("输入顶点信息及编号:\n");
while(1)
{
cin>>i;
if(i == -1)
break;
cin>>FA>>LR;
s=(struct BinaryTree *)malloc(sizeof(struct BinaryTree));
s->c=i;
s->l = s->r = NULL;
p[i] = s;
if(FA == -1)
t=s;
if( LR == "L")
p[FA]->l=s;
else if(LR =="R")
{
p[FA]->r=s;
}
}
return t;
}
void PreOrder(struct BinaryTree *bt)
{
if(bt)
{
cout<<bt->c;
PreOrder(bt->l);
PreOrder(bt->r);
}
}
void InOrder(struct BinaryTree *bt)
{
if(bt)
{
InOrder(bt->l);
cout<<bt->c;
InOrder(bt->r);
}
}
void PostOrder(struct BinaryTree *bt)
{
if(bt)
{
PostOrder(bt->l);
PostOrder(bt->r);
cout<<bt->c;
}
}
void LevelOrder(struct BinaryTree *bt)
{
struct BinaryTree* q[MAXSIZE];
int front,rear;
if(bt==NULL)
return;
front=0; /*非循环队列*/
rear=0;
q[rear++]=bt;
while(front!=rear)
{
cout<<q[front]->c;
if(q[front]->l!=NULL)
{
q[rear]=q[front]->l;
rear++;
}
if (q[front]->r!=NULL)
{
q[rear]=q[front]->r;
rear++;
}
front++;
}
}
int main()
{
int j;
struct BinaryTree *t;
t=Create_BiTree();
while(1)
{
printf("\n");
printf("请选择操作:\n");
printf("1: 二叉树的前序遍历\n");
printf("2: 二叉树的中序遍历\n");
printf("3: 二叉树的后序遍历\n");
printf("4: 二叉树的层次遍历\n");
scanf("%d",&j);
switch(j)
{
case 1:
printf("前序遍历结果:\n");
PreOrder(t);
break;
case 2:
printf("中序遍历结果:\n");
InOrder(t);
break;
case 3:
printf("后序遍历结果:\n");
PostOrder(t);
break;
case 4:
printf("按层遍历结果:\n");
LevelOrder(t);
break;
}
}
}