1. 程式人生 > 其它 >二叉樹的四種遍歷(C語言)

二叉樹的四種遍歷(C語言)

#include <stdio.h>
#include <stdlib.h>

typedef char ElementType;
typedef struct TNode *Position;
typedef Position BinTree;
struct TNode{
    ElementType Data;
    BinTree Left;
    BinTree Right;
};

BinTree CreatBinTree(); /* 實現細節忽略 */
void InorderTraversal( BinTree BT );
void PreorderTraversal
( BinTree BT ); void PostorderTraversal( BinTree BT ); void LevelorderTraversal( BinTree BT ); int main() { BinTree BT = CreatBinTree(); printf("Inorder:"); InorderTraversal(BT); printf("\n"); printf("Preorder:"); PreorderTraversal(BT); printf("\n"
); printf("Postorder:"); PostorderTraversal(BT); printf("\n"); printf("Levelorder:"); LevelorderTraversal(BT); printf("\n"); return 0; }

前序遍歷,中序遍歷和後序遍歷用遞迴可以簡單實現
層序遍歷可以通過申請一個出隊操作的佇列實現
下面是程式碼

void InorderTraversal( BinTree BT )
{
    if(BT){
        if
(BT->Left) InorderTraversal(BT->Left); printf(" %c",BT->Data); if(BT->Right) InorderTraversal(BT->Right); } } void PreorderTraversal( BinTree BT ) { if(BT){ printf(" %c",BT->Data); if(BT->Left) PreorderTraversal(BT->Left); if(BT->Right) PreorderTraversal(BT->Right); } } void PostorderTraversal( BinTree BT ) { if(BT){ if(BT->Left) PostorderTraversal(BT->Left); if(BT->Right) PostorderTraversal(BT->Right); printf(" %c",BT->Data); } } void LevelorderTraversal( BinTree BT ) { BinTree a[101]; int i,j; a[0] = BT; i = j = 0; while(BT){ if(BT->Left){ a[++i] = BT->Left; } if(BT->Right){ a[++i] = BT->Right; } printf(" %c",BT->Data); if(i == j){ break; } BT = a[++j]; } }

層序遍歷在佇列的出棧操作上糾結了很久,想著定義一個佇列來解決,但是我發現找不到結束的條件。。。沒有整個樹結點的個數。後來搜尋才發現暴力解決,申請一個足夠大不會溢位的陣列就行
用兩個變數i和j,分別指示佇列中新元素插入的位置和新元素的父母結點
整個插入的結束條件就是當i = j時,即最後一個葉子結點