实验3 二叉树

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验三:二叉树

学时:2学时

实验目的:掌握树形结构的特点,二叉树的存储方式以及相应操作。

实验内容:

按先序遍历序列建立二叉树的二叉链表,已知先序序列为(F表示空格):ABCFFDEFGFFFFFF。并写一个函数treenodes()统计该二叉树的节点个数。如果有可能,写一个输出函数treeprint()用树形结构打印出该二叉树。

提示:

1,统计结点数也是一种遍历操作,要首先理解遍历,递归程序。

2,由于printf打印是一行行按顺序的,要打印出树形结构,必须按层次遍历,并且利用空格。关键是控制每一层次打印的空格的数量,以及子树为空的情形。

可参考如下代码:

树的遍历:ch6_traverse.c

/*

树的遍历

author: kk.h

date: 2006.10

*/

#include "stdio.h"

typedef char ElemType;

typedef struct BiTNode{

ElemType data;

struct BiTNode *lchild,*rchild;

}BiTNode;

/* 先根遍历*/

void preorder(BiTNode *bt)

{ if(bt!=NULL)

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

preorder(bt->lchild);

preorder(bt->rchild);

}

}

/* 中根遍历*/

void inorder(BiTNode *bt)

{ if(bt!=NULL)

{ inorder(bt->lchild);

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

inorder(bt->rchild);

}

}

/* 后根遍历*/

void postorder(BiTNode *bt)

{ if(bt!=NULL)

{ postorder(bt->lchild);

postorder(bt->rchild);

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

}

}

/* 非递归算法的中根遍历(后进先出,用了栈的思想)*/ void inorder_fdg(BiTNode *bt)

{ int i=0;

BiTNode *p,*s[20];

p=bt;

do

{ while(p!=NULL)

{ s[i++]=p;

p=p->lchild;

}

if(i>0)

{ p=s[--i];

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

p=p->rchild;

}

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

}

/* 用队列实现层次遍历*/

void lev_traverse(BiTNode* T)

{

BiTNode *q[100],*p;

int head,tail, i;

q[0]=T;head=0;tail=1;

while(head

p=q[head++];

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

if(p->lchild!=NULL)

q[tail++]=p->lchild;

if(p->rchild!=NULL)

q[tail++]=p->rchild;

}

}

/* 利用先根序列建立二叉树,空的子树也要输入,用空格表示*/ BiTNode *crt_bt_pre()

{ char ch;

BiTNode *bt;

scanf("%c",&ch);

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

else

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

bt->data=ch;

bt->lchild=crt_bt_pre();

bt->rchild=crt_bt_pre();

}

return(bt);

}

/* 二叉树的释放*/

void freetree(BiTNode *bt)

{ if(bt!=NULL)

{ freetree(bt->lchild);

freetree(bt->rchild);

free(bt);

bt=NULL;

}

}

main()

{

BiTNode *T,*temp[20];

/* 笨方法建立二叉树*/

temp[0]=(BiTNode*)malloc(sizeof(BiTNode));

temp[0]->data = '-';

temp[1]=(BiTNode*)malloc(sizeof(BiTNode));

temp[1]->data = '+';

temp[0]->lchild = temp[1];

temp[2]=(BiTNode*)malloc(sizeof(BiTNode)); temp[2]->data = '/';

temp[0]->rchild = temp[2];

temp[3]=(BiTNode*)malloc(sizeof(BiTNode)); temp[3]->data = 'a';

temp[3]->lchild=NULL; temp[3]->rchild=NULL; temp[1]->lchild = temp[3];

temp[4]=(BiTNode*)malloc(sizeof(BiTNode)); temp[4]->data = '*';

temp[1]->rchild = temp[4];

temp[5]=(BiTNode*)malloc(sizeof(BiTNode)); temp[5]->data = 'e';

temp[5]->lchild=NULL; temp[5]->rchild=NULL; temp[2]->lchild = temp[5];

temp[6]=(BiTNode*)malloc(sizeof(BiTNode)); temp[6]->data = 'f';

temp[6]->lchild=NULL; temp[6]->rchild=NULL; temp[2]->rchild = temp[6];

temp[7]=(BiTNode*)malloc(sizeof(BiTNode)); temp[7]->data = 'b';

temp[7]->lchild=NULL; temp[7]->rchild=NULL; temp[4]->lchild = temp[7];

temp[8]=(BiTNode*)malloc(sizeof(BiTNode)); temp[8]->data = '-';

temp[4]->rchild = temp[8];

temp[9]=(BiTNode*)malloc(sizeof(BiTNode)); temp[9]->data = 'c';

temp[9]->lchild=NULL; temp[9]->rchild=NULL; temp[8]->lchild = temp[9];

temp[10]=(BiTNode*)malloc(sizeof(BiTNode)); temp[10]->data = 'd';

temp[10]->lchild=NULL; temp[10]->rchild=NULL; temp[8]->rchild = temp[10];

相关文档
最新文档