概述
二叉樹為每個節點最多有兩個兒子節點(左兒子節點和右兒子節點)的樹。
前序遍歷:根結點 ---> 左子樹 ---> 右子樹。
中序遍歷:左子樹---> 根結點 ---> 右子樹。
后序遍歷:左子樹 ---> 右子樹 ---> 根結點。
節點深度:節點ni的深度(depth)為從根到ni的唯一路徑的長。根的深度為0。
節點的高:節點ni的高(height)為從ni到一片樹葉的最長路徑。所有的樹葉(沒有兒子節點的節點)的高都為0。一棵樹的高等於它的根的高。
代碼實現
// 二叉樹的實現(C語言) // 鏈表,遞歸實現 // 編譯環境:visual studio 2017 // 操作系統:win8.1 #include<stdio.h> #include<malloc.h> #include<stdlib.h> typedef char Elementtype; // 定義數據類型,可根據需要自行定制 typedef struct TreeNode * Node; // Node相當於struct treeNode * // 定義數節點結構 typedef struct TreeNode { Elementtype Element; Node left; // 樹節點的左子節點 Node right; // 樹節點的右子節點 }TREE,*PTREE; // 函數聲明 void CreatTree(PTREE *); // 樹的先序創建函數 void PreOrderTree(PTREE ); // 樹的前序遍歷函數 void InOrderTree(PTREE ); // 樹的中序遍歷 void PostOrderTree(PTREE ); // 樹的后序遍歷 void LeafOfTree(PTREE ); // 打印樹的葉子節點函數 int Get_Leaf_Num(PTREE ); // 獲取樹葉子節點個數 int Get_Height(PTREE ); // 獲取樹的高度 // 主函數 int main() { PTREE Root; printf("請先序輸入二叉樹的節點數據: "); CreatTree(&Root); printf("\n前序遍歷結果為:"); PreOrderTree(Root); printf("\n中序遍歷結果為:"); InOrderTree(Root); printf("\n后序遍歷結果為:"); PostOrderTree(Root); printf("\n打印葉子節點為:"); LeafOfTree(Root); printf("\n葉子節點個數為:%d", Get_Leaf_Num(Root)); printf("\n二叉樹的高度為:%d", Get_Height(Root)); printf("\n"); return 0; } // 定義樹先序創建函數 void CreatTree(PTREE *Root) { char val=0; // 用於下面存放數據 val=getchar(); // 輸入數據值 // 如果輸入'*',則指向為空 if (val == '*') (*Root) = NULL; // 如果輸入非'*',則給數據域賦值 else { (*Root) = (PTREE)malloc(sizeof(TREE)); // 申請內存空間 if ((*Root) == NULL) { printf("創建節點失敗,無法分配可用內存..."); exit(-1); } else { (*Root)->Element = val; // 給節點數據域賦值 CreatTree(&(*Root)->left); CreatTree(&(*Root)->right); } } } // 樹的前序遍歷函數定義 void PreOrderTree(PTREE Root) { if (Root == NULL) return; else { putchar(Root->Element); PreOrderTree(Root->left); PreOrderTree(Root->right); } } // 樹的中序遍歷函數定義 void InOrderTree(PTREE Root) { if (Root == NULL) return; else { InOrderTree(Root->left); putchar(Root->Element); InOrderTree(Root->right); } } // 樹的后序遍歷函數定義 void PostOrderTree(PTREE Root) { if (Root==NULL) return ; else{ PostOrderTree(Root->left); PostOrderTree(Root->right); putchar( Root->Element); } } // 打印樹的葉子節點函數定義 void LeafOfTree(PTREE Tree) { if (Tree == NULL) return ; else { if (Tree->left == NULL&&Tree->right == NULL) putchar(Tree->Element); else { LeafOfTree(Tree->left); LeafOfTree(Tree->right); } } } // 獲取樹的葉子節點個數函數定義 int Get_Leaf_Num(PTREE Tree) { if (Tree == NULL) return 0; if (Tree->left == NULL&&Tree->right == NULL) return 1; //遞歸整個樹的葉子節點個數 = 左子樹葉子節點的個數 + 右子樹葉子節點的個數 return Get_Leaf_Num(Tree->left) + Get_Leaf_Num(Tree->right); } // 獲取樹高的函數定義 int Get_Height(PTREE Tree) { int Height = 0; if (Tree == NULL) return 0; //樹的高度 = max(左子樹的高度,右子樹的高度) + 1 else { int L_Height = Get_Height(Tree->left); int R_Height = Get_Height(Tree->right); Height = L_Height >= R_Height ? L_Height + 1 : R_Height + 1; } return Height; }
運行結果