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



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

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

(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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1. 什么是树? 树是一种非线性数据结构,它由若干个节点和若干个边组成,节点之间的关系是一对多的关系。树具有以下特点: - 每个节点最多只有一个父节点(除了根节点) - 每个节点可以有多个子节点 - 每个节点与根节点之间有唯一路径 2. 什么是二叉树二叉树是一种树形结构,它的每个节点最多只有两个子节点,一个左子节点和一个右子节点。二叉树具有以下特点: - 每个节点最多只有两个子节点 - 左子树和右子树是有顺序的,不能颠倒 - 二叉树可以为空树,也可以只有一个节点 3. 二叉树的遍历方式 二叉树的遍历方式有三种:前序遍历、中序遍历和后序遍历。三种遍历方式的区别在于节点的访问顺序不同。 - 前序遍历:先访问根节点,然后递归访问左子树和右子树 - 中序遍历:先递归访问左子树,然后访问根节点,最后递归访问右子树 - 后序遍历:先递归访问左子树和右子树,最后访问根节点 4. 二叉搜索树 二叉搜索树是一种特殊的二叉树,它满足以下性质: - 左子树上所有节点的值都小于根节点的值 - 右子树上所有节点的值都大于根节点的值 - 左右子树也分别为二叉搜索树 二叉搜索树的中序遍历是一个递增的序列。 5. 平衡二叉树 平衡二叉树是一种特殊的二叉搜索树,它的左子树和右子树的高度差不超过1,这样可以保证树的高度为logN,从而保证树的操作效率。 常见的平衡二叉树有AVL树、红黑树等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值