二叉树的各种遍历算法及其深度算法
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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); //求左子树的深度