我們都知道,二叉樹的遞歸遍歷可以分為三種:前序遍歷、中序遍歷和後序遍歷,其實這三種遍歷方式大同小異,由於都是使用遞歸實現的,因此也比較簡單。
首先是tree.h文件,代碼如下:
#ifndef TREE_H #define TREE_H #include <stdio.h> #include <malloc.h> #include <assert.h> typedef int ElemType; typedef struct Btree { ElemType val; struct Btree* left; struct Btree* right; }Btree, *Pbtree; #endif
然後是tree.c,代碼如下:
#include <stdio.h> #include <stdlib.h> #include "tree.h" /** * 獲取某個節點的值信息 * @param Pbtree pNode 節點對應的指針信息 * */ static void BtreeVisit(Pbtree pNode){ if (NULL != pNode){ printf("當前節點的值為: %d\n", pNode->val); } } /** * 構造一個tree節點,置左右指針為空,並且返回指向新節點的指針 * @param ElemType 值的類型 * @return Pbtree 指向新節點的指針 * */ static Pbtree BtreeMakeNode(ElemType target){ Pbtree pNode = (Pbtree) malloc(sizeof(Btree)); assert( NULL != pNode ); pNode->val = target; pNode->left = NULL; pNode->right = NULL; return pNode; } /** * 插入一個節點信息 * @param ElemType 要插入的數據 * @Param Pbtree* 指向某一個節點的指針 * @return Pbtree 指向新節點的指針 * */ Pbtree BtreeInsert(ElemType target, Pbtree* ppTree){ Pbtree pNode; assert( NULL != ppTree ); pNode = *ppTree; if (NULL == pNode){ return *ppTree = BtreeMakeNode(target); } //相同則不允許插入 if (pNode->val == target){ return NULL; }else if (pNode->val > target){ return BtreeInsert(target, &pNode->left); }else{ return BtreeInsert(target, &pNode->right); } } /** * 前序遍歷這個樹 * */ void BtreePreOrder(Pbtree pNode){ if (NULL != pNode){ BtreeVisit(pNode); BtreePreOrder(pNode->left); BtreePreOrder(pNode->right); } } int main(int argc, char *argv[]){ int i; int num[] = {21,43,2,6,88,9}; Pbtree root = NULL; for (i=0; i<sizeof(num)/sizeof(int); i++){ BtreeInsert(num[i], &root); } BtreePreOrder(root); return 0; }
這裡我們的數據在插入的時候是進行了一定的區分的,如果這個數字比較小,則會插入到左邊,如果大於該數字,則會插入到右邊,我們最終插入的結構應該是這樣的:
21
2 43
6 88
9
按照前序的輸出順序是:21 2 6 9 43 88