数据结构之二叉树

          二叉树遍历有先序遍历、中序遍历、后序遍历。下面有递归和非递归的方式:

  

#include "Status.h"
#include <malloc.h>

typedef struct BiTNode {
   TElemType data;
   struct BiTNode *LChild, *RChild;
}BiTNode, *BiTree;

typedef BiTree SElemType;
#include "SqStack.h"
void inputTElem(TElemType &e);
Status isEmptyElem(TElemType e);
void createBiTree(BiTree &T) {
          TElemType e;
          inputTElem(e);
          if(isEmptyElem(e))
                    T=NULL;
          else{

                    T=(BiTree)malloc(sizeof(BiTNode));
                    T->data = e;
                    createBiTree(T->LChild);
                    createBiTree(T->RChild);
          }
}
void PreOrderTraverse( BiTree T,
       void (*visit)(TElemType &e) ){

                 if(T){
                    visit(T->data);
                    PreOrderTraverse(T->LChild, visit);
                    PreOrderTraverse(T->RChild, visit);
                 }
}

void InOrderTraverse ( BiTree T,
void (*visit)(TElemType &e) ) {

       if(T){
          InOrderTraverse(T->LChild, visit);
          visit(T->data);
          InOrderTraverse(T->RChild, visit);

       }

}
void PostOrderTraverse (BiTree T,
void (*visit)(TElemType &e)) {

        if(T){

          PostOrderTraverse(T->LChild, visit);
          PostOrderTraverse(T->RChild, visit);
          visit(T->data);
        }

}
int countLeaf(BiTree T){
           int  countLeft, countRight;
           if(!T)  return 0;
           if(T->LChild==NULL&&T->RChild==NULL)
                    return 1;
           countLeft = countLeaf(T->LChild);
           countRight = countLeaf(T->RChild);

           return countLeft+countRight;

}

int depthBiTree(BiTree T ){
             int depthLeft, depthRight;
             if(!T)  return 0;
             else{
                  depthLeft = depthBiTree(T->LChild);
                  depthRight =  depthBiTree(T->RChild);

                  if(depthLeft >= depthRight)
                    return depthLeft+1;
                  else
                    return depthRight+1;

             }

}
void PreOrderTraverse_N(BiTree T,
          void (*visit)(TElemType &e)){

              SqStack S;
              InitSqStack(S, 100);
              BiTNode *p=T;
              while(p||!stackIsEmpty(S)){
                    if(p){
                           visit(p->data);
                              Push(S, p);
                              p=p->LChild;
                    }else{

                      Pop(S, p);
                      p=p->RChild;
                    }
              }

}
void InOrderTraverse_N(BiTree T,
                       void(*visit)(TElemType &e)){

                    SqStack S;
                    InitSqStack(S, 100);
                    BiTNode *p=T;
                    while(p||!stackIsEmpty(S)){
                        if(p){
                              Push(S, p);
                              p=p->LChild;
                        }else{

                               Pop(S, p);
                             visit(p->data);
                              p=p->RChild;
                        }
                    }

}
// main函数


#include <stdio.h>
#include <stdlib.h>
#include "Status.h"
typedef char TElemType;
#include "BiTree.h"
void visit(TElemType &e){//元素访问函数
   printf("%c", e);
}
void inputTElem(TElemType &e){

//该函数用于元素输入
    scanf("%c", &e);
}
Status isEmptyElem(TElemType e){
   //用于判断e是否为"空树"的特殊值
   if(e=='#') return TRUE;
   else return FALSE;
}
int main(){//测试主函数
   //先创建一棵二叉树并对基本操作进行验证
   BiTree T;
   printf("输入字符序列创建二叉树T:\n");
   createBiTree(T);   //创建二叉树
   printf("二叉树T的先序序列为:");
             PreOrderTraverse_N(T, visit);  //  非递归先序遍历
             printf("\t");
             PreOrderTraverse(T, visit);  // 递归先序遍历
   printf("\n");
   printf("二叉树T的中序序列为:");
              InOrderTraverse(T, visit);  //递归中序遍历
              printf("\t");
              InOrderTraverse_N(T, visit); //非递归中序遍历
   printf("\n");
   printf("二叉树T的后序序列为:");
              PostOrderTraverse(T, visit);  //后序遍历
   printf("\n");
   int count= countLeaf(T);  //求叶子结点数
   printf("叶子结点数=%d\n",count);
   int d=depthBiTree(T);  //求深度
   printf("深度=%d\n",d);

   return 0;
}
//test  ABD#G###CE##F##

 

posted @ 2014-11-17 18:30  tt_tt--->  阅读(129)  评论(0编辑  收藏  举报