1 #include<stdio.h> 2 #include<malloc.h> 3 #include<stdlib.h> 4 5 typedef char Elementtype; // 定义数据类型,可根据需要自行定制 6 typedef struct TreeNode * Node; // Node相当于struct treeNode * 7 // 定义数节点结构 8 typedef struct TreeNode { 9 Elementtype Element; 10 Node left; // 树节点的左子节点 11 Node right; // 树节点的右子节点 12 }TREE,*PTREE; 13 14 // 函数声明 15 void CreatTree(PTREE *); // 树的先序创建函数 16 void PreOrderTree(PTREE ); // 树的前序遍历函数 17 void InOrderTree(PTREE ); // 树的中序遍历 18 void PostOrderTree(PTREE ); // 树的后序遍历 19 void LeafOfTree(PTREE ); // 打印树的叶子节点函数 20 int Get_Leaf_Num(PTREE ); // 获取树叶子节点个数 21 int Get_Height(PTREE ); // 获取树的高度 22 23 24 // 主函数 25 int main() { 26 27 PTREE Root; 28 printf("请先序输入二叉树的节点数据: "); 29 CreatTree(&Root); 30 printf("\n前序遍历结果为:"); 31 PreOrderTree(Root); 32 printf("\n中序遍历结果为:"); 33 InOrderTree(Root); 34 printf("\n后序遍历结果为:"); 35 PostOrderTree(Root); 36 printf("\n打印叶子节点为:"); 37 LeafOfTree(Root); 38 printf("\n叶子节点个数为:%d", Get_Leaf_Num(Root)); 39 printf("\n二叉树的高度为:%d", Get_Height(Root)); 40 printf("\n"); 41 42 return 0; 43 } 44 45 // 定义树先序创建函数 46 void CreatTree(PTREE *Root) { 47 char val=0; // 用于下面存放数据 48 val=getchar(); // 输入数据值 49 // 如果输入'#',则指向为空 50 if (val == '#') 51 (*Root) = NULL; 52 // 如果输入非'#',则给数据域赋值 53 else { 54 (*Root) = (PTREE)malloc(sizeof(TREE)); // 申请内存空间 55 if ((*Root) == NULL) { 56 printf("创建节点失败,无法分配可用内存..."); 57 exit(-1); 58 } 59 else { 60 (*Root)->Element = val; // 给节点数据域赋值 61 CreatTree(&(*Root)->left); 62 CreatTree(&(*Root)->right); 63 } 64 } 65 66 } 67 // 树的前序遍历函数定义 68 void PreOrderTree(PTREE Root) { 69 if (Root == NULL) 70 return; 71 else { 72 putchar(Root->Element); 73 PreOrderTree(Root->left); 74 PreOrderTree(Root->right); 75 } 76 } 77 // 树的中序遍历函数定义 78 void InOrderTree(PTREE Root) { 79 if (Root == NULL) 80 return; 81 else { 82 InOrderTree(Root->left); 83 putchar(Root->Element); 84 InOrderTree(Root->right); 85 } 86 } 87 88 // 树的后序遍历函数定义 89 void PostOrderTree(PTREE Root) { 90 if (Root==NULL) 91 return ; 92 else{ 93 PostOrderTree(Root->left); 94 PostOrderTree(Root->right); 95 putchar( Root->Element); 96 } 97 } 98 99 // 打印树的叶子节点函数定义 100 void LeafOfTree(PTREE Tree) { 101 if (Tree == NULL) 102 return ; 103 else { 104 if (Tree->left == NULL&&Tree->right == NULL) 105 putchar(Tree->Element); 106 else { 107 LeafOfTree(Tree->left); 108 LeafOfTree(Tree->right); 109 } 110 } 111 } 112 113 // 获取树的叶子节点个数函数定义 114 int Get_Leaf_Num(PTREE Tree) { 115 if (Tree == NULL) 116 return 0; 117 if (Tree->left == NULL&&Tree->right == NULL) 118 return 1; 119 //递归整个树的叶子节点个数 = 左子树叶子节点的个数 + 右子树叶子节点的个数 120 return Get_Leaf_Num(Tree->left) + Get_Leaf_Num(Tree->right); 121 } 122 // 获取树高的函数定义 123 int Get_Height(PTREE Tree) { 124 int Height = 0; 125 if (Tree == NULL) 126 return 0; 127 //树的高度 = max(左子树的高度,右子树的高度) + 1 128 else 129 { 130 int L_Height = Get_Height(Tree->left); 131 int R_Height = Get_Height(Tree->right); 132 Height = L_Height >= R_Height ? L_Height + 1 : R_Height + 1; 133 } 134 return Height; 135 }