1. 程式人生 > 實用技巧 >王道資料結構 (8) 樹的遍歷

王道資料結構 (8) 樹的遍歷

這 3 種順序 是按照 跟節點的 訪問順序來的 跟節點什麼時候被訪問 決定了 它是哪個遍歷方式

1.先序 : A --> B -->D-->E-->C A是跟節點 BDE 是左節點 C是右節點 2.中序: 左中右 D-->B-->E-->A-->C BDE是左節點 A是中節點 C是右節點 3.後序 左右中 D-->E-->B-->C--A 例子: 標準樹

程式碼實現:

#include<stdio.h>

/*
* 二叉樹的前序、中序、後序、層序遍歷演示DEMO
*/ #include <stdio.h> typedef struct { char data;//資料區域(為了儲存ABCD,直接用char當做資料域,便於和文章中的插圖對應,穩!) struct BinaryTreeNode* left;//左子節點 struct BinaryTreeNode* right;//右子節點 }BinaryTreeNode; //為樹的當前節點新增左子節 int addLeftChild(BinaryTreeNode* curNode, char leftData) { //分配新節點? BinaryTreeNode* leftNode = (BinaryTreeNode*)malloc(sizeof(BinaryTreeNode));
//為新節點掛載資料 leftNode->data = leftData; //新節點暫時無子節點? leftNode->left = NULL; leftNode->right = NULL; //將新節點掛到當前節點點? curNode->left = leftNode; return 1; } //為樹的當前節點新增右子節點? int addRightChild(BinaryTreeNode* curNode, char rightData) { //分配新節點? BinaryTreeNode* rightNode = (BinaryTreeNode*)malloc(sizeof(BinaryTreeNode));
//為新節點掛載資料 rightNode->data = rightData; //新節點暫時無子節點? rightNode->left = NULL; rightNode->right = NULL; //將新節點掛到當前節點點? curNode->right = rightNode; return 1; } // 前序遍歷,根--點?--點? void preOrder(BinaryTreeNode *node) { if (node == NULL) { return; } printf("%c ", node->data); preOrder(node->left); preOrder(node->right); } // 中序遍歷,左--點?--點? void midOrder(BinaryTreeNode *node) { if (node == NULL) { return; } midOrder(node->left); printf("%c ", node->data); midOrder(node->right); } // 後序遍歷,左--點?--點? void afterOrder(BinaryTreeNode *node) { if (node == NULL) { return; } afterOrder(node->left); afterOrder(node->right); printf("%c ", node->data); } //----------------------------------------------------------------------------------------------------測試入口區域 int main() { //設定根節點? BinaryTreeNode root; //根節點A root.data = 'A'; addLeftChild(&root, 'B'); addRightChild(&root, 'C'); //為B節點增加子節點? addLeftChild(root.left, 'D'); addRightChild(root.left, 'E'); //為C節點增加子節點? addLeftChild(root.right, 'F'); addRightChild(root.right, 'G'); printf("\n前序遍歷:"); preOrder(&root); printf("\n中序遍歷:"); midOrder(&root); printf("\n後序遍歷:"); afterOrder(&root); return 1; }

輸出: