不少題目涉及到二叉樹,因此先把二叉樹的一些基本的建立和遍歷寫一下,方便以後的本地代碼調試。
爲了方便,這裏使用的數據爲char類型數值,初始化數據使用一個數組。
由於這些東西比較簡單,這裏就不作過多詳述。node
一、定義一些內容:數組
// 二叉樹節點結構體 typedef struct tree_node { struct tree_node *pL; struct tree_node *pR; char data; }TREE_NODE_S // 輸入數據的無效值,若讀到無效值,則說明該節點爲空 #define INVALID -1 // 全局變量,記錄當前輸入的數組位置 char count = 0 // 在遍歷樹的時候,須要對data作的操做 typedef void (*pfprocData)(char *p);
二、使用遞歸方式建立原始二叉樹。
其基本思想與先序遍歷基本同樣,只不過一個是對數據作輸出,一個是對數據作輸入。函數
TREE_NODE_S* createNode(char *str) { TREE_NODE_S *pTemp = NULL; char data = *(str+count); count ++; if (data != INVALID) { pTemp = (TREE_NODE_S *)calloc(1, sizeof(TREE_NODE_S)); if (NULL == pTemp) { return pTemp; } pTemp->data = data; pTemp->pL = createNode(str); pTemp->pR = createNode(str); } return pTemp; }
三、這裏再提供一種無返回值、傳樹的二級指針的建立方法:測試
createNode2(TREE_NODE_S **p, char *str) { TREE_NODE_S *pTemp = NULL; char data = *(str+count); count ++; if (data != INVALID) { pTemp = (TREE_NODE_S *)calloc(1, sizeof(TREE_NODE_S)); if (NULL == pTemp) { *p = NULL; return; } // 這裏直接對指針進行賦值 *p = pTemp; pTemp->data = data; createNode2(&(pTemp->pL), str); createNode2(&(pTemp->pR), str); } else { *p = NULL; } return; }
三種常見的前序、中序、後序遍歷:指針
// 這裏pfprocData,是用來處理結構體裏面的數據部分的函數 void frontOrder(TREE_NODE_S *p, pfprocData pfunc) { if (NULL == p) { return; } pfunc(&(p->data)); frontOrder(p->pL, pfunc); frontOrder(p->pR, pfunc); return; } void middleOrder(TREE_NODE_S *p, pfprocData pfunc) { if (NULL == p) { return; } middleOrder(p->pL, pfunc); pfunc(&(p->data)); middleOrder(p->pR, pfunc); return; } void lastOrder(TREE_NODE_S *p, pfprocData pfunc) { if (NULL == p) { return; } lastOrder(p->pL, pfunc); lastOrder(p->pR, pfunc); pfunc(&(p->data)); return; }
// 先建立出以下兩種樹,而後作遍歷輸出 // 1 // / \ // 2 4 // \ // 3 char ps1[] = {1, 2, INVALID, 3, INVALID, INVALID, 4, INVALID, INVALID}; // 1 // / \ // 2 6 // / \ \ // 3 5 7 // \ // 4 char ps2[] = {1, 2, 3, INVALID, 4, INVALID, INVALID, 5, INVALID, INVALID, 6, INVALID, 7, INVALID, INVALID}; // 這裏只對節點數據進行打印 void procData(char *p) { printf("%u ", *p); } int main(void) { TREE_NODE_S *pstTreeHead1 = NULL; TREE_NODE_S *pstTreeHead2 = NULL; pstTreeHead1 = createTree2(ps1); pstTreeHead2 = createTree2(ps2) // 若是使用第二個建立方法,則: // createTree(&pstTreeHead1, ps1); // createTree(&pstTreeHead2, ps2); printf("%-14s", "frontOrder:"); frontOrder(pstTreeHead1, procData); printf("\n"); printf("%-14s", "frontOrder:"); frontOrder(pstTreeHead2, procData); printf("\n"); printf("%-14s", "middleOrder:"); middleOrder(pstTreeHead2, procData); printf("\n"); printf("%-14s", "lastOrder:"); lastOrder(pstTreeHead2, procData); printf("\n"); }