二叉树的各种遍历算法及其深度算法

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

二叉树的算法:

用扩展先序遍历序列创建二叉树;

递归遍历算法

中序非递归遍历层次遍历

二叉树深度的算法

实现代码如下:

#include

#include

#include

typedef struct Node

{

char data;

struct Node *LChild;

struct Node *RChild;

}BitNode,*BitTree;

typedef struct CSNode

{

char data;

struct CSNode *fch, *nextSib;

}CSNode, *CSTree;

void CreatBiTree(BitTree *bt)//用扩展先序遍历序列创建二叉树,如果是#当前树根置为空,否则申请一个新节点//

{

char ch;

ch=getchar();

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

else

{

*bt=(BitTree)malloc(sizeof(BitNode));

(*bt)->data=ch;

CreatBiTree(&((*bt)->LChild));

CreatBiTree(&((*bt)->RChild));

}

}

void Visit(char ch)//访问根节点

{

printf("%c ",ch);

}

//以下为递归遍历算法

void PreOrder(BitTree root) /*先序遍历二叉树, root为指向二叉树(或某一子树)根结点的指针*/

{

if (root!=NULL)

{

Visit(root ->data); /*访问根结点*/

PreOrder(root ->LChild); /*先序遍历左子树*/

PreOrder(root ->RChild); /*先序遍历右子树*/

}

}

void InOrder(BitTree root)

/*中序遍历二叉树, root为指向二叉树(或某一子树)根结点的指针*/

{

if (root!=NULL)

{

InOrder(root ->LChild); /*中序遍历左子树*/

Visit(root ->data); /*访问根结点*/

InOrder(root ->RChild); /*中序遍历右子树*/

}

}

void PostOrder(BitTree root)

/* 后序遍历二叉树,root为指向二叉树(或某一子树)根结点的指针*/

{

if(root!=NULL)

{

PostOrder(root ->LChild); /*后序遍历左子树*/

PostOrder(root ->RChild); /*后序遍历右子树*/

Visit(root ->data); /*访问根结点*/

}

}

//中序非递归遍历

void InOrder1(struct Node *head)

{

struct Node *p;

struct Node *stack[20];

int top=0;

p=head;

while(p||top!=0)

{

while (p)

{

stack[top++]=p;

p=p->LChild ;

}

p=stack[--top];

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

p=p->RChild ;

}

}

//层次遍历

void translevel(BitTree b) //按层次遍历

{ struct node

{ BitTree *vec[100];

int f,r;

} q;

q.f=0;

q.r=0;

if (b!=NULL) printf("%c ",b->data);

q.vec[q.r]=&b; //结点指针进入队列

q.r=q.r+1;

while (q.f

{ b=*q.vec[q.f]; q.f=q.f+1; //队头出队列

if (b->LChild!=NULL) //输出左孩子,并入队列

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

q.vec[q.r]=&(b->LChild);

q.r=q.r+1;

}

if (b->RChild!=NULL) //输出右孩子,并入队列

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

q.vec[q.r]=&(b->RChild);

q.r=q.r+1;

}

}

}

int PostTreeDepth(BitTree bt) //后序遍历求二叉树的高度递归算法// {

int hl,hr,max;

if(bt!=NULL)

{

hl=PostTreeDepth(bt->LChild); //求左子树的深度

相关文档
最新文档