zoukankan      html  css  js  c++  java
  • 二叉树基本操作——收录

      1 #include   
      2 #include   
      3 #include
      4 typedefchar ElemType;   //定义树的结点类型  
      5 typedefstruct BiTNode     
      6 {    
      7      ElemType data;    
      8 struct BiTNode *lchild;  
      9 struct BiTNode *rchild;       
     10 }BiTNode,*BiTree;    
     11 //创建空二叉树
     12 void InitBiTree(BiTree &T)  
     13 {  
     14     T = NULL;  
     15 }  
     16 //二叉树的创建  
     17 void CreateBiTree(BiTree &T)    
     18 {    
     19 char ch;    
     20     scanf("%c",&ch);    
     21 if(ch == ' ')   
     22     {  
     23         T=NULL; //截止二叉树的建立
     24     }  
     25 else
     26     {    
     27        T = (BiTNode *) malloc(sizeof(BiTNode)); //申请结点空间   
     28 if(!T)  
     29           exit(0);  
     30        T-<data = ch;    
     31        CreateBiTree(T-<lchild);  //构造左子树
     32        CreateBiTree(T-<rchild);  //构造右子树
     33      }    
     34  }     
     35 ////////////////////////////////////////////  
     36 //二叉树的先序遍历  
     37 void  PreOrderTraverse(BiTNode *p)    
     38 {    
     39 if(p != NULL)    
     40   {    
     41       printf("%c*",p-<data);    
     42       PreOrderTraverse(p-<lchild);    
     43       PreOrderTraverse(p-<rchild);    
     44    }    
     45  }    
     46 //二叉树的中序遍历  
     47 void InOrderTraverse(BiTNode *p)    
     48 {    
     49 if(p != NULL)    
     50    {    
     51       InOrderTraverse(p-<lchild);    
     52       printf("%c*",p-<data);    
     53       InOrderTraverse(p-<rchild);    
     54    }    
     55  }    
     56 //二叉树的后序遍历  
     57 void PostOrderTraverse(BiTNode *p)    
     58 {    
     59 if(p != NULL)    
     60     {    
     61         PostOrderTraverse(p-<lchild);    
     62         PostOrderTraverse(p-<rchild);    
     63         printf("%c*",p-<data);    
     64     }    
     65 }     
     66 //求二叉树的高度
     67 int High(BiTNode *p)  
     68 {  
     69 int lh=0;  
     70 int rh=0;  
     71 if(p == NULL)  
     72     {  
     73 return 0;  
     74     }  
     75     lh=High(p-<lchild);  
     76     rh=High(p-<rchild);  
     77 if(lh<rh)  
     78     {  
     79 return lh+1;  
     80     }  
     81 else
     82     {  
     83 return rh+1;  
     84     }  
     85 }  
     86 //求二叉树的结点数目
     87 int Count(BiTree T)  
     88 {  
     89 if(T == NULL)  
     90     {  
     91 return 0;  
     92     }  
     93 return Count(T-<lchild)+Count(T-<rchild)+1;  
     94 }  
     95 //实现左右子树的交换
     96 void exchange(BiTree T)  
     97 {  
     98 if(T == NULL)  
     99     {  
    100 return;  
    101     }  
    102 else
    103     {  
    104         BiTree temp=T-<lchild;  
    105         T-<lchild = T-<rchild;  
    106         T-<rchild = temp;  
    107         exchange(T-<lchild);  
    108         exchange(T-<rchild);  
    109     }  
    110 }  
    111 //前序遍历的非递归算法
    112 void PreTraverse(BiTree T)  
    113 {  
    114     BiTree p;  
    115     p=T;  
    116     stack S;  
    117     S.IintStack();  
    118 while(p || S.StackEmpty())  
    119     {  
    120 if(p)  
    121         {  
    122             printf("%d",p-<data);  
    123             Push(&S,p);  
    124             p=p-<lchild;  
    125         }  
    126 else
    127         {  
    128             S.pop(p);  
    129             p=p-<rchild;  
    130         }  
    131     }  
    132 }  
    133 //中序遍历的非递归算法
    134 void InTraverse(BiTree T)  
    135 {  
    136     BiTree p;  
    137     p=T;  
    138     stack S;  
    139     S.IintStack();  
    140 while(p || S.StackEmpty())  
    141     {  
    142 if(p)  
    143         {  
    144             Push(&S,p);  
    145             p=p-<lchild;  
    146         }  
    147 else
    148         {  
    149             S.pop(p);  
    150             printf("%d",p-<data);  
    151             p=p-<rchild;  
    152         }  
    153     }  
    154 }  
    155 //后序遍历的非递归算法
    156 #define MaxSize 100
    157 void PostTraverse(BiTree T)  
    158 {  
    159    BiTree p;  
    160    stack S;  
    161 int intstack[MaxSize];  
    162 int i;  
    163 int top;  
    164    p=T;  
    165 //S.IintStack();
    166 for(int i=0;i<100 ispan>
    167    {  
    168        intstack[i]=0;  
    169    }  
    170    top=0;  
    171 while(p || S.empty())  
    172    {  
    173 if(p)  
    174        {  
    175            Push(&S,p);  
    176            intstack[top]=0;  
    177            top++;  
    178            p=p-<lchild;  
    179        }  
    180 else
    181        {  
    182 if(intstack[top-1] == 0)  
    183            {  
    184                GetTop(S,&p);  
    185                intstack[top-1]=1;  
    186                p=p-<rchild;  
    187            }  
    188 else
    189            {  
    190                Pop(&S,&p);  
    191                top--;  
    192                printf("%d",p-<data);  
    193                p=NULL;  
    194            }  
    195        }  
    196    }  
    197 }  
    198 int main()    
    199 {    
    200     BiTree T;    
    201     CreateBiTree(T);    
    202     PreOrderTraverse(T);    
    203     printf("
    ");    
    204     InOrderTraverse(T);    
    205     printf("
    ");    
    206     PostOrderTraverse(T);    
    207     printf("
    ");    
    208 int a=High(T);  
    209 int b=Count(T);  
    210     exchange(T);  
    211 return 0;   
    212  }   
  • 相关阅读:
    无限维
    黎曼流形
    why we need virtual key word
    TOJ 4119 Split Equally
    TOJ 4003 Next Permutation
    TOJ 4002 Palindrome Generator
    TOJ 2749 Absent Substrings
    TOJ 2641 Gene
    TOJ 2861 Octal Fractions
    TOJ 4394 Rebuild Road
  • 原文地址:https://www.cnblogs.com/pengjunwei/p/3705746.html
Copyright © 2011-2022 走看看