zoukankan      html  css  js  c++  java
  • 树和二叉树(代码)

    【代码】

      1 #include <stdio.h>
      2 #include <stdlib.h>
      3 
      4 typedef int ElementType;
      5 
      6 typedef struct TreeNode {
      7     ElementType Data;
      8     struct TreeNode *Left;
      9     struct TreeNode *Right;
     10 }*BinTree, *Position;
     11 
     12 Position createBinNode(ElementType data)
     13 {
     14     Position T;
     15 
     16     T = (Position)malloc(sizeof(struct TreeNode));
     17     if(T == NULL)
     18     {
     19         return NULL;
     20     }
     21     T->Left  = NULL;
     22     T->Right = NULL;
     23     T->Data  = data;
     24 
     25     return T;
     26 }
     27 
     28 // 二叉树的递归遍历
     29 void PreOrderTraversal(BinTree Bt)
     30 {
     31     if(Bt)
     32     {
     33         printf("%c ", Bt->Data);
     34         PreOrderTraversal(Bt->Left);
     35         PreOrderTraversal(Bt->Right);
     36     }
     37 }
     38 
     39 #if 0
     40 void PreOrderTraversal_R2L(BinTree Bt)
     41 {
     42     if(Bt)
     43     {
     44         printf("%c ", Bt->Data);
     45         PreOrderTraversal_R2L(Bt->Right);
     46         PreOrderTraversal_R2L(Bt->Left);
     47     }
     48 }
     49 #endif
     50 
     51 void InOrderTraversal(BinTree Bt)
     52 {
     53     if(Bt)
     54     {
     55         InOrderTraversal(Bt->Left);
     56         printf("%c ", Bt->Data);
     57         InOrderTraversal(Bt->Right);
     58     }
     59 }
     60 
     61 void PostOrderTraversal(BinTree Bt)
     62 {
     63     if(Bt)
     64     {
     65         PostOrderTraversal(Bt->Left);
     66         PostOrderTraversal(Bt->Right);
     67         printf("%c ", Bt->Data);
     68     }
     69 }
     70 
     71 // 二叉树的非递归遍历
     72 void PreOrderTraversal_ext(BinTree Bt)
     73 {
     74     BinTree pStack[100];
     75     int top = -1;
     76     Position pBt = Bt;
     77 
     78     while(pBt != NULL || top > -1) /* Bt || !isEmpty(pStack) */
     79     {
     80         while(pBt)
     81         {
     82             // 与中序遍历不同点就是在第一次压栈的时候就进行访问了
     83             printf("%c ", pBt->Data);
     84             pStack[++top] = pBt;
     85             pBt = pBt->Left;
     86         }
     87         if(top > -1) /* !isEmpty(pStack) */
     88         {
     89             pBt = pStack[top--];
     90             //printf("%c ", pBt->Data);
     91             pBt = pBt->Right; /* 转向右子树 */
     92         }
     93     }
     94 }
     95 
     96 void InOrderTraversal_ext(BinTree Bt)
     97 {
     98     BinTree pStack[100];
     99     int top = -1;
    100     Position pBt = Bt;
    101 
    102     // 当前访问的结点没有右子树的时候,就会出现pBt==NULL,但是栈不空的情况
    103     while(pBt != NULL || top > -1) /* Bt || !isEmpty(pStack) */
    104     {
    105         // TODO: 1.遇到一个结点,就把它压栈,并去遍历它的左子树
    106         while(pBt)
    107         {
    108             pStack[++top] = pBt;
    109             pBt = pBt->Left;
    110         }
    111         // TODO: 2.当左子树遍历结束后,从栈顶弹出这个结点并访问它
    112         if(top > -1) /* !isEmpty(pStack) */
    113         {
    114             pBt = pStack[top--];
    115             printf("%c ", pBt->Data);
    116             // TODO: 3.然后按其右指针再去中序遍历该结点的右子树
    117             pBt = pBt->Right; /* 转向右子树 */
    118         }
    119     }
    120 }
    121 
    122 void PostOrderTraversal_ext(BinTree Bt)
    123 {
    124     BinTree pStack[100];
    125     int top = -1;
    126     Position pBt = Bt;
    127     Position pPre = NULL;
    128 
    129     // 先把根结点入栈
    130     pStack[++top] = Bt;
    131     while(top > -1)
    132     {
    133         // 只探测栈顶的结点是否满足被访问的条件
    134         // 当前结点为叶结点 或者 当前结点的左孩子或右孩子已经被访问过来,则满足访问条件
    135         // 怎么保证当前弹出栈的结点比其父结点先出的?
    136         pBt = pStack[top];
    137         if((pBt->Left == NULL && pBt->Right == NULL)
    138             || (pPre != NULL && (pPre == pBt->Left || pPre == pBt->Right)))
    139         {
    140             printf("%c ", pBt->Data);
    141             top--;
    142             pPre = pBt;
    143         }
    144         else
    145         {
    146             if(pBt->Right != NULL)
    147             {
    148                 pStack[++top] = pBt->Right;
    149             }
    150             if(pBt->Left != NULL)
    151             {
    152                 pStack[++top] = pBt->Left;
    153             }
    154         }
    155     }
    156 }
    157 
    158 void LevelOrderTraversal(BinTree Bt)
    159 {
    160     BinTree pQueue[100];
    161     int head = 0;
    162     int tail = 0;
    163     BinTree pBt;
    164 
    165     pQueue[tail++] = Bt;
    166     while(tail != head)
    167     {
    168         pBt = pQueue[head++];
    169         printf("%c ", pBt->Data);
    170         if(pBt->Left != NULL)
    171         {
    172             pQueue[tail++] = pBt->Left;
    173         }
    174         if(pBt->Right != NULL)
    175         {
    176             pQueue[tail++] = pBt->Right;
    177         }
    178     }
    179 }
    180 
    181 // 输出二叉树的叶子结点,无论前中后序,叶子的输出顺序都是一样的,从树的左到右.
    182 void PreOrderPrintLeaves(BinTree Bt)
    183 {
    184     if(Bt)
    185     {
    186         if(Bt->Left == NULL && Bt->Right == NULL)
    187             printf("%c ", Bt->Data);
    188         PreOrderPrintLeaves(Bt->Left);
    189         PreOrderPrintLeaves(Bt->Right);
    190     }
    191 }
    192 
    193 void InOrderPrintLeaves(BinTree Bt)
    194 {
    195     if(Bt)
    196     {
    197         InOrderPrintLeaves(Bt->Left);
    198         if(Bt->Left == NULL && Bt->Right == NULL)
    199             printf("%c ", Bt->Data);
    200         InOrderPrintLeaves(Bt->Right);
    201     }
    202 }
    203 
    204 void PostOrderPrintLeaves(BinTree Bt)
    205 {
    206     if(Bt)
    207     {
    208         PostOrderPrintLeaves(Bt->Left);
    209         PostOrderPrintLeaves(Bt->Right);
    210         if(Bt->Left == NULL && Bt->Right == NULL)
    211             printf("%c ", Bt->Data);
    212     }
    213 }
    214 
    215 // 求二叉树的叶结点个数
    216 static int giNodeCnt = 0;
    217 void PreOrderGetNodes(BinTree Bt)
    218 {
    219     if(Bt)
    220     {
    221         PreOrderGetNodes(Bt->Left);
    222         PreOrderGetNodes(Bt->Right);
    223         if(Bt->Left == NULL && Bt->Right == NULL)
    224             giNodeCnt++;
    225     }
    226 }
    227 
    228 int BinTreeGetLeaves(BinTree Bt)
    229 {
    230     if(Bt == NULL)
    231         return 0;
    232     if(Bt->Left == NULL && Bt->Right == NULL)
    233         return 1;
    234     else
    235         return BinTreeGetLeaves(Bt->Left) + BinTreeGetLeaves(Bt->Right);
    236 }
    237 
    238 // 求二叉树的高度
    239 int PostOrderGetHeight(BinTree Bt)
    240 {
    241     int HL, HR, MaxH;
    242 
    243     if(Bt)
    244     {
    245         HL = PostOrderGetHeight(Bt->Left);
    246         HR = PostOrderGetHeight(Bt->Right);
    247         MaxH = (HL > HR) ? HL : HR;
    248         return (MaxH + 1);
    249     }
    250     else
    251     {
    252         return 0;
    253     }
    254 }
    255 
    256 int main(void)
    257 {
    258     int MaxH;
    259     Position T1;
    260     Position T21, T22;
    261     Position T31, T32, T33, T34;
    262     Position T41, T42, T43, T44, T45, T46, T47, T48;
    263 
    264     T1  = createBinNode('A');
    265     T21 = createBinNode('B');
    266     T22 = createBinNode('C');
    267     T31 = createBinNode('D');
    268     T32 = createBinNode('F');
    269     T33 = createBinNode('G');
    270     T34 = createBinNode('I');
    271     T43 = createBinNode('E');
    272     T46 = createBinNode('H');
    273 
    274     
    275     T1->Left   = T21;
    276     T1->Right  = T22;
    277 
    278     T21->Left  = T31;
    279     T21->Right = T32;
    280 
    281     T22->Left  = T33;
    282     T22->Right = T34;
    283 
    284     T32->Left  = T43;
    285 
    286     T33->Right = T46;
    287     
    288     printf("
    ");
    289     printf("PreOrderTraversal:
    ");
    290     PreOrderTraversal(T1);
    291 
    292     printf("
    ");
    293     printf("PreOrderTraversal_ext:
    ");
    294     PreOrderTraversal_ext(T1);
    295 
    296     //printf("
    ");
    297     //printf("PreOrderTraversal R->L:
    ");
    298     //PreOrderTraversal_R2L(T1);
    299 
    300     printf("
    ");
    301     printf("InOrderTraversal:
    ");
    302     InOrderTraversal(T1);
    303 
    304     printf("
    ");
    305     printf("InOrderTraversal_ext:
    ");
    306     InOrderTraversal(T1);
    307 
    308     printf("
    ");
    309     printf("PostOrderTraversal:
    ");
    310     PostOrderTraversal(T1);
    311 
    312     printf("
    ");
    313     printf("PostOrderTraversal_ext:
    ");
    314     PostOrderTraversal_ext(T1);
    315 
    316     printf("
    ");
    317     printf("LevelOrderTraversal:
    ");
    318     LevelOrderTraversal(T1);
    319 
    320     printf("
    ");
    321     printf("PreOrderPrintLeaves:
    ");
    322     PreOrderPrintLeaves(T1);
    323     printf("
    ");
    324     printf("InOrderPrintLeaves:
    ");
    325     InOrderPrintLeaves(T1);
    326     printf("
    ");
    327     printf("PostOrderPrintLeaves:
    ");
    328     PostOrderPrintLeaves(T1);
    329 
    330     printf("
    ");
    331     printf("PostOrderGetHeight::");
    332     MaxH = PostOrderGetHeight(T1);
    333     printf("%d
    ", MaxH);
    334 
    335     printf("
    ");
    336     PreOrderGetNodes(T1);
    337     printf("PreOrderNodes: %d
    ", giNodeCnt);
    338 
    339     printf("
    ");
    340     printf("BinTreeGetLeaves: %d
    ", BinTreeGetLeaves(T1));
    341 
    342     return 0;
    343 }
  • 相关阅读:
    如何有效地报告 Bug
    Linux开始结束ping命令
    【转】未能加载文件或程序集“XXX”或它的某一个依赖项。试图加载格式不正确的程序。
    .net session 使用误区
    [转] ADO.NET调用存储过程带输出参数或返回值
    ASP.NET Easyui datagrid增删改+sqlhelper
    C#分割字符串并统计重复出现的次数
    C# 读取TXT文本数据 添加到数据库
    记一次Spring项目打包问题排查
    Wiki系列(三):我的Wiki
  • 原文地址:https://www.cnblogs.com/utank/p/4274360.html
Copyright © 2011-2022 走看看