• 二叉树的递归遍历


    【先序遍历】

        遍历的过程为:

    • 访问“根结点”
    • “先序”遍历其“左子树”
    • “先序”遍历其“右子树”
    1 void PreOrderTraversal( BinTree BT )
    2 {
    3     if( BT )
    4     {
    5         printf(“%d”, BT->Data);
    6         PreOrderTraversal( BT->Left );
    7         PreOrderTraversal( BT->Right );
    8     }
    9 }    

    访问过程: 

    1次遇到结点即访问:AB D F E) (C G H I)

    【中序遍历】

        遍历过程为:

    • “中序”遍历其“左子树”
    • 访问“根结点”
    • “中序”遍历其“右子树”
    1 void InOrderTraversal( BinTree BT )
    2 {
    3     if( BT ) 
    4     {
    5         InOrderTraversal( BT->Left );
    6         printf(“%d”, BT->Data);
    7         InOrderTraversal( BT->Right );
    8     }
    9 }

    访问过程:

    2次遇到结点才访问:(D B E F) A (G H C I)

    【后序遍历】

        遍历过程为:

    • “后序”遍历其“左子树”
    • “后序”遍历其“右子树”
    • 访问“根结点”
    1 void PostOrderTraversal( BinTree BT )
    2 {
    3     if( BT ) 
    4     {
    5         PostOrderTraversal( BT->Left );
    6         PostOrderTraversal( BT->Right);
    7         printf(“%d”, BT->Data);
    8     }
    9 }

    访问过程:

    3次遇到结点才访问:(D E F B) (H G I CA


    先序、中序和后序遍历过程中,经过结点的路线一样,只是访问各结点的时机不同:先序遍历第1次遇到结点就进行访问;中序遍历第2次遇到结点才进行访问;后序遍历则第3次遇到结点才访问。

    无论前中后,叶子的顺序一样?从左到右?

    前:A B D F E C G H I

    中:D B E F A G H C I

    后:D E F B H G I C A

     


     测试代码:

      1 #include <stdio.h>
      2 #include <stdlib.h>
      3 
      4 typedef int ElementType;
      5 
      6 //struct TreeNode;
      7 
      8 //typedef struct TreeNode *BinTree;
      9 //typedef struct BinTree Position;
     10 
     11 typedef struct TreeNode {
     12     ElementType Data;
     13     struct TreeNode *Left;
     14     struct TreeNode *Right;
     15 }*BinTree, *Position;
     16 
     17 Position createBinNode(ElementType data)
     18 {
     19     Position T;
     20 
     21     T = (Position)malloc(sizeof(struct TreeNode));
     22     if(T == NULL)
     23     {
     24         return NULL;
     25     }
     26     T->Left  = NULL;
     27     T->Right = NULL;
     28     T->Data  = data;
     29 
     30     return T;
     31 }
     32 
     33 void PreOrderTraversal(BinTree Bt)
     34 {
     35     if(Bt)
     36     {
     37         printf("%c ", Bt->Data);
     38         PreOrderTraversal(Bt->Left);
     39         PreOrderTraversal(Bt->Right);
     40     }
     41 }
     42 
     43 void PreOrderTraversal_R2L(BinTree Bt)
     44 {
     45     if(Bt)
     46     {
     47         printf("%c ", Bt->Data);
     48         PreOrderTraversal_R2L(Bt->Right);
     49         PreOrderTraversal_R2L(Bt->Left);
     50     }
     51 }
     52 
     53 void InOrderTraversal(BinTree Bt)
     54 {
     55     if(Bt)
     56     {
     57         InOrderTraversal(Bt->Left);
     58         printf("%c ", Bt->Data);
     59         InOrderTraversal(Bt->Right);
     60     }
     61 }
     62 
     63 void PostOrderTraversal(BinTree Bt)
     64 {
     65     if(Bt)
     66     {
     67         PostOrderTraversal(Bt->Left);
     68         PostOrderTraversal(Bt->Right);
     69         printf("%c ", Bt->Data);
     70     }
     71 }
     72 
     73 int main(void)
     74 {
     75     Position T1;
     76     Position T21, T22;
     77     Position T31, T32, T33, T34;
     78     Position T41, T42, T43, T44, T45, T46, T47, T48;
     79 
     80     T1  = createBinNode('A');
     81     T21 = createBinNode('B');
     82     T22 = createBinNode('C');
     83     T31 = createBinNode('D');
     84     T32 = createBinNode('F');
     85     T33 = createBinNode('G');
     86     T34 = createBinNode('I');
     87     T43 = createBinNode('E');
     88     T46 = createBinNode('H');
     89 
     90     
     91     T1->Left   = T21;
     92     T1->Right  = T22;
     93 
     94     T21->Left  = T31;
     95     T21->Right = T32;
     96 
     97     T22->Left  = T33;
     98     T22->Right = T34;
     99 
    100     T32->Left  = T43;
    101 
    102     T33->Right = T46;
    103     
    104     printf("PreOrderTraversal:
    ");
    105     PreOrderTraversal(T1);
    106 
    107     printf("
    ");
    108     printf("PreOrderTraversal R->L:
    ");
    109     PreOrderTraversal_R2L(T1);
    110 
    111     printf("
    ");
    112     printf("InOrderTraversal:
    ");
    113     InOrderTraversal(T1);
    114 
    115     printf("
    ");
    116     printf("PostOrderTraversal:
    ");
    117     PostOrderTraversal(T1);
    118 
    119     printf("
    ");
    120 
    121     return 0;
    122 }
  • 相关阅读:
    系统调用简单总结
    系统调用原理详解
    总结:c 语言与Linux操作系统的关系
    poj3171 Cleaning Shifts
    洛谷P1032 字串变换
    poj3662 Telephone Lines
    洛谷P1073 最优贸易
    Uva1330/poj1964 City Game
    poj2559/SP1805 Largest Rectangle in a Histogram
    洛谷 P1196 [NOI2002]银河英雄传说
  • 原文地址:https://www.cnblogs.com/utank/p/4259295.html
Copyright © 2020-2023  润新知