二叉树的遍历

来源:互联网 发布:c 字符串数组拷贝 编辑:程序博客网 时间:2024/05/21 10:36

设计和调试的算法微笑希望对你们有用哟:

1、递归建立二叉树;

2、先序递归遍历二叉树;

3、中序递归遍历二叉树;

4、后序递归遍历二叉树。

5、中序非递归遍历二叉树

首先要建立一个工程,编译器用codeblocks, vc 6.0等,都能运行,但是可能需要自己调试一下,毕竟每个编译器的环境都是不一样的。微笑

头文件//header,h

#include <cstdlib>#include <cstdio>#include <iostream>#include <windows.h>#define  TRUE 1#define  FALSE 0#define  OK 1#define  ERROR 0#define INFEASIBLE -1#define  OVERFLOW-2#define LIST_INIT_SIZE 100#define LISTINCREMENT 10#define STACK_INIT_SIZE 100#define STACKINCREMENT 10using namespace std;              //Status是函数的类型,其值是函数结果状态代码typedef int  status;typedef int TelemType; 


算法头文件//Bitree.h

 

#include"header.h"typedef struct BiTNode {       TelemTypedata;        structBiTNode *lchild,*rchild;} BiTNode,*BiTree;typedef BiTree SElemType;typedef struct {              SElemType *base;              SElemType  *top;              int stacksize;              }SqStack;status InitStack(SqStack &S) {       S.base =(SElemType *)malloc  (STACK_INIT_SIZE*sizeof (SElemType));       if(!S.base) exit (OVERFLOW);       S.top =S.base;       S.stacksize= STACK_INIT_SIZE;       return OK;     }//InitStackstatus StackEmpty(SqStack S){  if (S.base==S.top)    return TRUE;  return FALSE;}status Push(SqStack &S, SElemType &e) {          if (S.top-S.base>=S.stacksize) //栈满           { S.base=(SElemType *)realloc             (S.base, (S.stacksize+STACKINCREMENT)             * sizeof(SElemType));             if (!S.base) exit (OVERFLOW);             S.top  = S.base + S.stacksize;             S.stacksize+=STACKINCREMENT;              } // if           *S.top++ = e;   return OK; } //Pushstatus Pop(SqStack &S, SElemType &e) {         if(S.top == S.base)return ERROR;        e = * -- S.top;        return OK;       } //Popstatus CreateBiTree(BiTree &T){//按先序次序输入二叉树中结点的值,空格表示空树//生成二叉树的二叉链表存储结构,T为根结点指针]    char ch;   cin>>ch;    if (ch==' ')T=NULL;    else{          if(!(T=(BiTNode *) malloc(sizeof(BiTNode)))) exit(OVERFLOW);          T->data=ch;  //建立根结点          CreateBiTree( T->lchild);  //建立左子树          CreateBiTree(T->rchild);  //建立右子树          }  return OK;} //CreateBiTreestatus PrintElement(TelemType e){   cout<<e;  //输出元素值    return OK;}status PreorderTraverse(BiTree T, status(*visit)(TelemType e)) {//先序遍历根结点指针为T的二叉树 if (T)  {   if(visit(T->data))     if(PreorderTraverse(T->lchild,visit))       if(PreorderTraverse(T->rchild,visit)) return OK;       returnERROR;       }elsereturn OK;   //if (T) }//PreorderTraversestatus InorderTraverse1(BiTree T, status(*visit)(TelemType e)) {       //先序遍历根结点指针为T的二叉树        if(T)  {              if(InorderTraverse1(T->lchild,visit))                     if(visit(T->data))                            if(InorderTraverse1(T->rchild,visit)) return OK;              returnERROR;       }elsereturn OK;   //if (T)}//InorderTraversestatus  PostorderTraverse(BiTreeT, status(*visit)(TelemType e)) {//后序遍历根结点指针为T的二叉树 if (T)  {   if(PostorderTraverse(T->lchild,visit))       if(PostorderTraverse(T->rchild,visit))              if(visit(T->data))  return OK;       returnERROR;       }elsereturn OK;   //if (T) }//PostorderTraversestatus InorderTraverse2(BiTree T,status(*visit)(TelemType e)) {       SqStack S;       InitStack(S);   BiTree p = T;              while(p || !StackEmpty(S) ){ // 找到最左下的结点                     if(p)               {  Push(S,p);   p=p->lchild;  } // 根指针进栈,遍历左子树                     else  {                                 //根指针退栈,访问根结点,遍历右子树                            Pop(S,p);   if (!visit(p->data)  ) return ERROR;                            p=p->rchild;                     }//else              }// while              return  OK;}// InOrderTraverse

主函数//main.cpp

#include"header.h"#include"Bi tree.h"int main(){    BiTree T;    cout<< "Please input characters to create a tree" << endl;   CreateBiTree(T);    cout<<endl<< "preorder traverse the tree:"<<endl;   PreorderTraverse(T, PrintElement);    cout<<endl<<"inorder traverse thw tree:digui"<<endl;    InorderTraverse1(T,PrintElement);    cout<<endl<<"Inorder traverse the tree:feidigui"<<endl;   InorderTraverse2(T,PrintElement);    cout<<endl<<"Postorder traverse the tree:"<<endl;   PostorderTraverse(T,PrintElement);    return 0;} 


0 0
原创粉丝点击