数据结构实验二二叉树的创建与访问算法的设计

  • 格式:docx
  • 大小:111.26 KB
  • 文档页数:7

内蒙古工业大学信息工程学院实验报告

1

实验二 二叉树的创建与访问算法的设计

一、目的

本实验的目的是通过理解二叉树的逻辑结构和存储结构,进一步提高使用理论知识指导解决实际问题的能力。

二、选题

1—4.

源代码:

#include

#include

typedef struct BiTnode

{ char data;

struct BiTnode *lchild,*rchild;

}BiTree;

#define N 30

BiTree *bt,*BT[N];

int M; /*记录数据相同的结点的个数*/

int deepth=0; /*记录深度*/

/*按先序遍历序列建立二叉树的二叉链表*/

BiTree *Pre_create_BiTree(BiTree *bt)

{ char ch;

scanf("%c",&ch);

fflush(stdin);

if(ch=='0') bt=NULL;

else

{ bt=(BiTree *)malloc(sizeof(BiTree));

bt->data=ch;

deepth++;

printf("请输入第 %d 层上结点 %c 的在第 %d 层的左孩子:\t",

deepth,bt->data,deepth+1);

bt->lchild = Pre_create_BiTree(bt->lchild);

deepth++;

printf("请输入第 %d 层上结点 %c 的在第 %d 层的右孩子:\t",

deepth,bt->data,deepth+1);

bt->rchild=Pre_create_BiTree(bt->rchild);

}

deepth--;

return(bt);

}

A

B E

C D F

E

内蒙古工业大学信息工程学院实验报告

2

/*先序递归遍历*/

void Preorder_BiTree(BiTree *bt)

{ if(bt!=NULL)

{ printf("%c\t",bt->data);

Preorder_BiTree(bt->lchild);

Preorder_BiTree(bt->rchild);

}

}

/*中序递归遍历*/

void Inorder_recursive_BiTree(BiTree *bt)

{ if(bt!=NULL)

{ Inorder_recursive_BiTree(bt->lchild);

printf("%c\t",bt->data);

Inorder_recursive_BiTree(bt->rchild);

}

}

/*中序非递归遍历*/

void Inorder_non_recursive_BiTree(BiTree *bt)

{ int i=0;

BiTree*p,*s[N];

p=bt;

do

{ while(p!=NULL)

{ s[i++]=p;

p=p->lchild;

}

if(i>0)

{ p=s[--i];

printf("%c\t",p->data);

p=p->rchild;

}

}while(i>0||p!=NULL);

}

/*后序递归遍历*/

void Postorder_BiTree(BiTree *bt)

{ if(bt!=NULL)

{ Postorder_BiTree(bt->lchild);

Postorder_BiTree(bt->rchild);

printf("%c\t",bt->data);

}

}

内蒙古工业大学信息工程学院实验报告

3

void Search_BiTree(BiTree *bt,char x)

{

if(bt)

{ if(bt->data==x)

{BT[M]=bt;M++;}

Search_BiTree(bt->lchild,x);

Search_BiTree(bt->rchild,x);

}

}

void Parent_BiTree(BiTree *bt,BiTree *BT[])

{

if(bt)

{ if(bt->lchild!=NULL)

if(bt->lchild==BT[M])

{

printf("符合数据 %c 的第 %d 个结点的双亲结点的数据是: %c\n",BT[M]->data,M+1,bt->data);

M++;

}

Parent_BiTree(bt->lchild,BT);

if(bt->rchild!=NULL)

if(bt->rchild==BT[M])

{

printf("符合数据 %c 的第 %d 个结点的双亲结点的数据是: %c\n",BT[M]->data,M+1,bt->data);

M++;

}

Parent_BiTree(bt->rchild,BT);

}

}

int main()

{

BiTree *BTnode1,*BTnode2;

int choice,i=0;

char ch;

do

{ printf(" #二叉树菜单# \n");

printf("******************************\n\n");

printf("-_-||-_-1.建立二叉树 -_-||-_-\n");

printf("-_-||-_-2.遍历二叉树 -_-||-_-\n");

printf("-_-||-_-3.查找二叉结点-_-||-_-\n");

printf("-_-||-_-4.查找双亲结点-_-||-_-\n");

内蒙古工业大学信息工程学院实验报告

4

printf("-_-||-_-5.退出 -_-||-_-\n\n");

printf("******************************\n");

printf("请输入操作序号(1,2,3,4,5): ");

scanf("%d", &choice);

getchar();

switch(choice)

{

case 1:

printf("请输入要构建的二叉树的先序序列,以'0'表示空\n");

printf("请输入根结点: \t\t\t\t");

bt=Pre_create_BiTree(bt);

printf("构建二叉树成功!\n");

break;

case 2:

if(bt != NULL) //树不为空且已进行“创建”操作时执行

{

printf("先序递归遍历结果:\n");

Preorder_BiTree(bt);

printf("\n----------------------------------\n");

printf("中序递归遍历结果:\n");

Inorder_recursive_BiTree(bt);

printf("\n----------------------------------\n");

printf("中序非递归遍历结果:\n");

Inorder_non_recursive_BiTree(bt);

printf("\n----------------------------------\n");

printf("后序递归遍历结果:\n");

Postorder_BiTree(bt);

printf("\n----------------------------------\n");

}

else

printf("\n还没建立二叉树!\n\n");

break;

case 3:printf("请输入要查找的二叉树的数据: ");

scanf("%c",&ch);

if(bt)

{ M=0;

Search_BiTree(bt,ch);

if(BT[0])

for(i=0;i

内蒙古工业大学信息工程学院实验报告

5

printf("符合数据: %c 的第 %d 个结点在: %x

\n",BT[i]->data,i+1,BT[i]);

else printf("无该结点!\n");

for(i=0;i

BT[i]=NULL;

M=0;

}

else

printf("\n还没建立二叉树!\n\n");

break;

case 4:

printf("求某结点双亲请输入该结点的数据: ");

scanf("%c",&ch);

if(bt)

{ for(i=0;i

BT[i]=NULL;