1. 程式人生 > 實用技巧 >王道資料結構 (11) 樹的後序遍歷非遞迴程式碼實現

王道資料結構 (11) 樹的後序遍歷非遞迴程式碼實現

程式碼實現:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define ElementType char
int top_S1 = -1; //定義棧S1 top下標
int top_S2 = -1; //定義棧S2 top下標

// 結點結構體
typedef struct BinTNode
{
  ElementType data;
  struct BinTNode *left;
  struct BinTNode *right;
} BinTNode, *BinTree;

// 初始化樹形結構
BinTNode *CreateBiTree(BinTNode *T) { T = (BinTNode *)malloc(sizeof(BinTNode)); T->data = 'A'; T->left = (BinTNode *)malloc(sizeof(BinTNode)); T->left->data = 'B'; T->right = (BinTNode *)malloc(sizeof(BinTNode)); T->right->data = 'C'; T->left->left = (BinTNode *)malloc(sizeof
(BinTNode)); T->left->left->data = 'D'; T->left->right = (BinTNode *)malloc(sizeof(BinTNode)); T->left->right->data = 'E'; T->left->right->left = NULL; T->left->right->right = NULL; T->left->left->left = (BinTNode *)malloc(sizeof(BinTNode)); T
->left->left->left->data = 'H'; T->left->left->left->left = NULL; T->left->left->left->right = NULL; T->left->left->right = (BinTNode *)malloc(sizeof(BinTNode)); T->left->left->right->data = 'I'; T->left->left->right->left = NULL; T->left->left->right->right = NULL; T->right->left = (BinTNode *)malloc(sizeof(BinTNode)); T->right->left->data = 'F'; T->right->left->left = NULL; T->right->left->right = NULL; T->right->right = (BinTNode *)malloc(sizeof(BinTNode)); T->right->right->data = 'G'; T->right->right->left = NULL; T->right->right->right = NULL; return T; } // 棧S1 - 進棧push void push_S1(BinTNode **stack, BinTNode *elem) { stack[++top_S1] = elem; } // 棧S2 - 進棧push void push_S2(BinTNode **stack, BinTNode *elem) { stack[++top_S2] = elem; } //棧S1 - 彈棧pop void pop_S1() { if (top_S1 == -1) { return; } top_S1--; } //棧S2 - 彈棧pop void pop_S2() { if (top_S2 == -1) { return; } top_S2--; } // 遍歷過程中,輸出結點值 void printElement(BinTNode *elem) { printf("%c ", elem->data); } //獲取棧頂元素 BinTNode *getTop_S1(BinTNode **stack) { return stack[top_S1]; } //獲取棧頂元素 BinTNode *getTop_S2(BinTNode **stack) { return stack[top_S2]; } //非遞迴遍歷 - 左右根 void PostOrderTraverse(BinTNode *Tree) { BinTNode *S1[30]; // 輔助棧 BinTNode *S2[30]; BinTNode *T = Tree; // 定義臨時指標 BinTNode *Temp; push_S1(S1, T); // 初始化S1的top元素是樹的根結點 while (top_S1 != -1) { T = getTop_S1(S1); // S1的棧頂元素彈出 pop_S1(); // 棧頂元素彈棧 push_S2(S2, T); if (T->left != NULL || T->right != NULL) { // 棧頂元素有孩子結點 if (T->left != NULL) push_S1(S1, T->left); if (T->right != NULL) push_S1(S1, T->right); } } // 逐個彈出S2的元素 while (top_S2 != -1) { printElement(getTop_S2(S2)); pop_S2(); } } int main() { BinTNode *Tree; Tree = CreateBiTree(Tree); printf("後序遍歷:\t"); PostOrderTraverse(Tree); printf("\n"); return 0; }

輸出:

轉載:https://zhuanlan.zhihu.com/p/136124168