云中烛火

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
  1 typedef int Status;
  2 typedef int Boolean;
  3 typedef int ElemType;
  4 
  5 typedef char TElemType ;
  6 
  7 typedef struct  BiTNode
  8 {
  9     TElemType data;
 10     BiTNode  *lchild,*rchild;//左右孩子指针
 11 
 12 }BiTNode,*BiTree;
 13 
 14 
 15 Status InitBiTree(BiTree &T){
 16     //操作结果:构造空二叉树
 17     T=NULL;
 18     return OK;
 19 }
 20 
 21 void DestroyBiTree(BiTree &T){
 22     //初始条件:二叉树存在。操作结果:销毁而茶树T
 23     if(T){//非空树
 24         if(T->lchild)//有左孩子
 25             DestroyBiTree(T->lchild);//销毁左孩子子树
 26         if(T->rchild)//有右孩子
 27             DestroyBiTree(T->rchild);//销毁右孩子
 28         free(T);//释放根节点
 29         T=NULL;
 30 
 31     }
 32 }
 33 
 34 
 35 void CreateBiTree(BiTree &T){
 36     TElemType ch;
 37     #ifdef CHAR
 38         scanf("%c",&ch);
 39     #endif
 40     #ifdef INT
 41         scanf("%d",&ch);
 42     #endif
 43     if(ch==NULL)
 44         T=NULL;
 45     else{
 46         T=(BiTree)malloc(sizeof(BiTNode));
 47         if(!T)
 48             exit(OVERFLOW);
 49         T->data=ch;//生成根节点
 50         CreateBiTree(T->lchild);//构造左孩子
 51         CreateBiTree(T->rchild);//构造右孩子
 52     }
 53 }
 54 
 55 Status BiTreeEmpty(BiTree T){
 56     if(T)
 57         return FALSE;
 58 }
 59 
 60 
 61 int BiTreeDepth(BiTree T){
 62     //初始条件:二叉树T存在。操作结果:返回T的深度
 63     int i,j;
 64     if(!T)
 65         return 0;
 66     if(T->lchild)
 67         i=BiTreeDepth(T->lchild);
 68     else
 69         i=0;
 70     if(T->rchild)
 71         j=BiTreeDepth(T->rchild);
 72     else
 73         j=0;
 74     return i>j?i+1:j+1;
 75 }
 76 
 77 TElemType Root(BiTree T){
 78     //初始条件:二叉树T存在。操作结果:返回T的根
 79     if(BiTreeEmpty(T))
 80         return NULL;
 81     else
 82         return T->data;
 83 }
 84 
 85 
 86 void PreOrderTraverse(BiTree T,Status(*Visit)(TElemType))
 87  { // 初始条件: 二叉树T存在,Visit是对结点操作的应用函数。算法6.1,有改动
 88    // 操作结果: 先序递归遍历T,对每个结点调用函数Visit一次且仅一次
 89    if(T) // T不空
 90    {
 91      Visit(T->data); // 先访问根结点
 92      PreOrderTraverse(T->lchild,Visit); // 再先序遍历左子树
 93      PreOrderTraverse(T->rchild,Visit); // 最后先序遍历右子树
 94    }
 95  }
 96 
 97  void InOrderTraverse(BiTree T,Status(*Visit)(TElemType))
 98  { // 初始条件: 二叉树T存在,Visit是对结点操作的应用函数
 99    // 操作结果: 中序递归遍历T,对每个结点调用函数Visit一次且仅一次
100    if(T)
101    {
102      InOrderTraverse(T->lchild,Visit); // 先中序遍历左子树
103      Visit(T->data); // 再访问根结点
104      InOrderTraverse(T->rchild,Visit); // 最后中序遍历右子树
105    }
106  }
107 
108 
109  void PostOrderTraverse(BiTree T,Status(*Visit)(TElemType))
110  { // 初始条件: 二叉树T存在,Visit是对结点操作的应用函数
111    // 操作结果: 后序递归遍历T,对每个结点调用函数Visit一次且仅一次
112    if(T) // T不空
113    {
114      PostOrderTraverse(T->lchild,Visit); // 先后序遍历左子树
115      PostOrderTraverse(T->rchild,Visit); // 再后序遍历右子树
116      Visit(T->data); // 最后访问根结点
117    }
118  }
119 
120 
121 void LevelOrderTraverse(BiTree T,Status(*Visit)(TElemType))
122  { // 初始条件:二叉树T存在,Visit是对结点操作的应用函数
123    // 操作结果:层序递归遍历T(利用队列),对每个结点调用函数Visit一次且仅一次
124    LinkQueue q;
125    QElemType a;
126    if(T)
127    {
128      InitQueue(q);
129      EnQueue(q,T);
130      while(!QueueEmpty(q))
131      {
132        DeQueue(q,a);
133        Visit(a->data);
134        if(a->lchild!=NULL)
135          EnQueue(q,a->lchild);
136        if(a->rchild!=NULL)
137          EnQueue(q,a->rchild);
138      }
139      printf("\n");
140    }
141  }

 

posted on 2014-03-27 16:21  云中烛火  阅读(260)  评论(0)    收藏  举报