您的位置:首页 > 其它

二叉树的建立与基本操作

2011-07-09 09:32 323 查看
 二叉树的建立与基本操作(10分)
成绩: 10 / 折扣: 0.8
在本实验中,程序的输入是一个(扩展)二叉树的先序序列。例如:如图所示的二叉树,其(扩展)二叉树先序序列为ab#d##ce### 。

程序实现二叉树的如下操作:
1) 建立二叉链表
2) 二叉树的先序、中序、后序遍历
3)求解二叉树的叶子结点个数
4)将二叉树中所有结点的左、右子树相互交换
程序的输出为:
二叉树的凹入表示,二叉树的先序序列、中序序列、后序序列,二叉树的叶子结点个数,左、右子树相互交换后的二叉树的凹入表示, 左、右子树相互交换后的二叉树的先序序列、中序序列、后序序列 。
在输出凹入表示的二叉树时,先输出根结点,然后依次输出左右子树,上下层结点之间相隔3 个空格,如:针对上面给出的输入,输出的内容应为:
BiTree
a
b
d
c
e
pre_sequence : abdce
in_sequence : bdaec
post_sequence : dbeca
Number of leaf: 2
BiTree swapped
a
c
e
b
d
pre_sequence : acebd
in_sequence : ceadb
post_sequence : ecdba
 #include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct treenode
{
char data;
struct treenode *left,*right;
};

int leaf=0;

struct treenode *CreateBiTree(struct treenode *p)
{
int i,j,k,len,left=1;
char c;

scanf("%c",&c);

if (c == '#')
{
return NULL;
}
else
{
p = (struct treenode*)malloc(sizeof(struct treenode));
p->data = c;
p->left = CreateBiTree(p->left);
p->right = CreateBiTree(p->right);
}
return p;
}

void PrintTree(struct treenode *p,int space)
{
int i;
if (p == NULL)
{
return;
}
if (p->left == NULL && p->right == NULL)
{
leaf++;
}
for (i = 0;i < space;i++)
{
printf(" ");
}
printf("%c\n",p->data);
PrintTree(p->left,space+4);
PrintTree(p->right,space+4);
}

void PreOrderTraverse(struct treenode *p)
{
if (p == NULL)
{
return;
}
printf("%c",p->data);
PreOrderTraverse(p->left);
PreOrderTraverse(p->right);
}

void InOrderTraverse(struct treenode *p)
{
if (p == NULL)
{
return;
}
InOrderTraverse(p->left);
printf("%c",p->data);
InOrderTraverse(p->right);
}

void PostOrderTraverse(struct treenode *p)
{
if (p == NULL)
{
return;
}
PostOrderTraverse(p->left);
PostOrderTraverse(p->right);
printf("%c",p->data);
}

void Swap(struct treenode *p)
{
struct treenode *q;

if (p == NULL)
{
return;
}
Swap(p->left);
Swap(p->right);
q=p->right;
p->right=p->left;
p->left=q;
}

void main()
{
int i,j,k;
char in[100];
struct treenode *root;

root = (struct treenode*)malloc(sizeof(struct treenode));
root=CreateBiTree(root);

printf("BiTree\n");
PrintTree(root,0); //pre-output

printf("pre_sequence : ");
PreOrderTraverse(root); //pre,in,post
printf("\n");
printf("in_sequence : ");
InOrderTraverse(root);
printf("\n");
printf("post_sequence : ");
PostOrderTraverse(root);
printf("\n");

printf("Number of leaf: %d\n",leaf);
printf("BiTree swapped\n");

Swap(root);

PrintTree(root,0);
printf("pre_sequence : ");
PreOrderTraverse(root); //pre,in,post
printf("\n");
printf("in_sequence : ");
InOrderTraverse(root);
printf("\n");
printf("post_sequence : ");
PostOrderTraverse(root);
printf("\n");

}
 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: