二叉树的遍历算法(含非递归中序遍历和释放(free)二叉树,通过VC++调试运行)

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

// Defines the entry point for the console application.

//#include"stdafx.h"

#include"iostream"

using namespace std;

typedef char DataType;

struct BitreeNode{

DataType data;

BitreeNode *lchild;

BitreeNode *rchild;

};

void Preorder(struct BitreeNode *p) // 先序遍历二叉树{

if (p!=NULL)

{

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

Preorder( p->lchild );

Preorder(p->rchild );

}

}

void Inorder(struct BitreeNode *p) // 中序遍历二叉树{

if (p!=NULL)

{

Inorder( p->lchild );

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

Inorder(p->rchild ) ;

}

}//Inorder

void Postorder(struct BitreeNode *p) // 后序遍历二叉树{

if (p!=NULL)

{

Postorder( p->lchild );

Postorder(p->rchild ) ;

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

// a=&b;

}

}//Postorder

BitreeNode *CreateBitree() //按先序次序输入二叉树

{ char ch;

scanf("%c",&ch);

BitreeNode* T=NULL;

if(ch!='#')

{

T= (struct BitreeNode*)(malloc(sizeof(struct BitreeNode)));

T->data=ch;

T->lchild=CreateBitree();

T->rchild=CreateBitree();

}

return T;

}

void DeleteTree(struct BitreeNode *p) // // 释放存储空间

{

if (p!=NULL)

{

DeleteTree( p->lchild );

DeleteTree(p->rchild ) ;

free(p);

}

}//Postorder

void Inorder2(BitreeNode *T) // 中序遍历二叉树的非递归算法

{

BitreeNode *p;

BitreeNode * stack[100]; //定义了一个栈的对象S int top=0;

stack[top++]=T; //根结点的指针进栈while (top>0)

{

p= stack[top-1];

while (p)

{

stack[top++]= p->lchild ; //往左下走到底

p= stack[top-1];

}

p= stack[--top]; // 空指针退栈

if (top>0 )

{

p=stack[--top];

cout<data;

stack[top++]= p->rchild; //访问结点后向右下一步 }//if

}

//while

}

void main()

{ //Bitree MyBitree;

struct BitreeNode *T=0;

// T=MyBitree.T;

T=CreateBitree();

printf("\n前序遍历\n");

Preorder(T) ;

printf("\n后序遍历\n");

Postorder(T);

printf("\n中序遍历\n");

Inorder(T);

printf("\n中序遍历(非递归)\n");

Inorder2(T);

cout<<"\n";

DeleteTree(T);

}

显示结果:

上面运行程序时取二叉树的实例如下:

输入序列为:abc###fd##e##

相关文档
最新文档