C线索二叉树

  • 线索二叉树的实现。
    // main.cpp
    // test
    //
    // Created by 梁亚宾 on 16/6/4.
    // Copyright © 2016年 liang. All rights reserved.
    //

          //#include 
          #include 
          #include 
    
          typedef char ElemType;
    
          ///link 左右左孩子 thread前后继线索
          typedef enum {link, thread} PointerTag;
    
          typedef struct BiThrNode
          {
              char data;
              struct BiThrNode *lchild,*rchild;
              PointerTag lTag;
              PointerTag rTag;
          }BiThrNode, *BiThrTree ;
    
          ///全局变量,始终指向刚刚访问过的结点
          BiThrTree pre;
    
          /// 创建一个二叉树,约定用户遵照前序遍历的方式输入数据
          void CreateBithrTree(BiThrTree *T){
              
              char c;
              scanf("%c",&c);
              
              if (' ' == c){
                  
                  *T = NULL;
                  
              }else{
                  
                  *T = (BiThrNode *)malloc(sizeof(BiThrNode));
                  (*T)->data = c;
                  (*T)->lTag = link;
                  (*T)->rTag = link;
                  
                  CreateBithrTree(&(*T)->lchild);
                  CreateBithrTree(&(*T)->rchild);
              }
              
          }
    
          ///中序遍历 线索化
          void InThreading(BiThrTree T){
    
              if (!T) {
                  return ;
              }
              
              InThreading(T->lchild);//递归左孩子。线索化
              
              if(!T->lchild){
                  
                  T->lTag = thread;  //记录左边为线索
                  T->lchild = pre;  // 记录指向上一个索引
              }
              
              if (!pre->rchild){//前一个指向下一个为索引
                  
                  pre->rTag = thread; //记录右边为索引
                  pre->rchild = T;   //记录指向下一个
              }
              
              InThreading(T->rchild);//递归右孩子 线索化
              
          }
    
          void InOrderThreading(BiThrTree *p,BiThrTree T){
              
              *p = (BiThrTree)malloc(sizeof(BiThrNode));
              (*p)->lTag = link;
              (*p)->rTag = thread;
              if (!T){
                  
                  (*p)->lchild = *p;
                  
              }else{
                  
                  (*p)->lchild = T;
                  pre = *p;
                  InThreading(T);
                  
                  pre->rchild = *p;
                  pre->rTag = thread;
                  (*p)->rchild = pre;
              }
              
          }
    
          int main(){
             
              BiThrTree P,T = NULL;
              
              CreateBithrTree(&T);
              
              InOrderThreading(&P, T);
              
              return 0;
          }
    

个人博客: www.liangtongzhuo.com

你可能感兴趣的:(C线索二叉树)