数据结构_树形结构_二叉树

来源:互联网 发布:山西省软件开发企业 编辑:程序博客网 时间:2024/05/17 23:55


数据结构_树形结构_二叉树

根据实验报告,对二叉树的基本操作进行的整理:

(1)采用下列方法之一建立二叉树的二叉链表:

① 输入完全二叉树的先序序列,用#代表虚结点(空指针),如ABD###CE##F##,建立二叉树的二叉链表。

void CreatBiTree(BiTree &bt){

//① 输入完全二叉树的先序序列,用#代表虚结点(空指针),如ABD###CE##F##,建立二叉树的二叉链表。

char ch;

ch = getchar();

if(ch=='#')

bt = NULL;

else{

bt = (BiTree)malloc(sizeof(BTNode));

bt->data = ch;

CreatBiTree(bt->lchild);

CreatBiTree(bt->rchild);

}

}//CreatBiTree

② 已知二叉树的先序遍历序列和中序遍历序列,或者已知二叉树的中序遍历序列和后序遍历序列,建立二叉树的二叉链表。

void CreatBiTree(BiTree &bt,char PreOrder[],char InOrder[],int NodeNumber){

//利用先序遍历和中序遍历创建二叉链表

char PreOrderL[20],PreOrderR[20],InOrderL[20],InOrderR[20];//可以跟据结点数,自行定义数组长度

int i=0,j,light,right;

if(bt) bt = NULL; exit(0);

else {bt = (BiTree)malloc(sizeof(BTNode));

if(!bt) exit(0);

bt->data = PreOrder[0];

while(InOrder[i]!=bt->data)

i++;

for(j=0;j<i;j++){

PreOrderL[j] = PreOrder[j+1];

InOrderL[j] = InOrder[j];

}

for(j = i+1;j<NodeNumber;j++){

PreOrderR[j-i-1] = PreOrder[j];

InOrderR[j-i-1] = InOrder[j];

}

light = i;     right = j;

if(light < 1)

bt->lchild = NULL;

else 

CreatBiTree(bt,PreOrderL,InOrderL,light);

if(right < 1)

bt->rchild = NULL;

else

CreatBiTree(bt,PreOrderR,InOrderR,right);

}

}③ 将一棵二叉树的所有结点存储在一维数组中,虚结点用#表示,利用二叉树的性质5,建立二叉树的二叉链表。例如用数组a存储的二叉树的结点如下(0单元不用):

void CreatBiTree(BiTree &bt,char Data[],int n){

 

CQueue Q;

int Qn[MAX],f,r,i;

BiTree p;

if(n<1){

bt = NULL;

return;

}

bt = (BiTree)malloc(sizeof(BTNode));

bt ->data = Data[1];

InitQueue(Q); EnQueue(Q,bt);

f = r = 0;

Qn[r++]=1;

while(!QueueEmpty(Q)){

DeQueue(Q,p); i=Qn[f++];

if(2*i > n || Data[2*i] == '#')

p->lchild = NULL;

else{

p->lchild = (BiTree)malloc(sizeof(BTNode));

p->lchild->data = Data[2*i];

EnQueue(Q,p->lchild);

Qn[r++] = 2*i;

}

if(2*i+1 > n || Data[2*i+1] == '#')

p->rchild = NULL;

else{

p->rchild = (BiTree)malloc(sizeof(BTNode));

p->rchild->data = Data[2*i+1];

EnQueue(Q,p->rchild);

Qn[r++] = 2*i+1;

}

}

 

}

2)写出对用二叉链表存储的二叉树进行先序、中序和后序遍历的递归和非递归算法。

//------------------二叉树的递归遍历-----------------------------

void PreOrderTraverse(BiTree bt){

//二叉树先序遍历的递归算法

if(bt){

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

PreOrderTraverse(bt->lchild);

PreOrderTraverse(bt->rchild);

}

}//PreOrderTraverse

 

void InOrderTraverse(BiTree bt){

//二叉树中序遍历的递归算法

if(bt){

InOrderTraverse(bt->lchild);

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

InOrderTraverse(bt->rchild);

}

}//InOrderTraverse

 

void PostOrderTraverse(BiTree bt){

//二叉树后序遍历的递归算法

if(bt){

PostOrderTraverse(bt->lchild);

PostOrderTraverse(bt->rchild);

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

}

}//PostOrderTraverse

 

//------------------非递归遍历的实现---------------------------

void PreOrderTraverse(BiTree bt){

//二叉树的非递归遍历

BiTree p;

SqStack s;

if(bt){

InitStack(s);

Push(s,bt);

while(!StackEmpty(s)){

while(GetTop(s,p) && p){

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

Push(s,p->lchild);

}

Pop(s,p);

if(!StackEmpty(s)){

Pop(s,p);

Push(s,p->rchild);

}

}

}

printf("\n");

}//PreOrderTraverse

 

void InOrderTraverse(BiTree bt){

//非递归函数的中序遍历

SqStack s;

BiTree p;

if(bt){

InitStack(s);

Push(s,bt);

while(!StackEmpty(s)){

while(GetTop(s,p) && p)

Push(s,p->lchild);

Pop(s,p);

if(!StackEmpty(s)){

Pop(s,p);

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

Push(s,p->rchild);

}

}

}

printf("\n");

}//InOrderTraverse

 

void PostOrderTraverse(BiTree bt){

//非递归函数的后序遍历

SqStack s;

BiTree p,q;

if(bt){

InitStack(s);

Push(s,bt);

while(!StackEmpty(s)){

while(GetTop(s,p) && p)

Push(s,p->lchild);

Pop(s,p);

if(!StackEmpty(s)){

GetTop(s,p);

if(p->rchild)

Push(s,p->rchild);

else{

Pop(s,p);

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

while(!StackEmpty(s) && GetTop(s,q) && q->rchild == p){

Pop(s,p);

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

}

if(!StackEmpty(s)){

GetTop(s,p);

Push(s,p->rchild);

}

}

}

}

}

printf("\n");

}//PostOrderTraverse

(3)写出对用二叉链表存储的二叉树进行层次遍历算法。

void LevelOrderTraverse(BiTree bt)

{

Queue Q;

int count=0;

BiTree p;

if (bt)

{

InitQueue(Q); EnQueue(Q, bt);

while (!QueueEmpty(Q))

{

DeQueue(Q, p);

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

count++;

if (p->lchild)EnQueue(Q, p->lchild);

if (p->rchild)EnQueue(Q, p->rchild);

 

}

}

printf("结点数为:%d",count);

}

 

 

0 0
原创粉丝点击