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 }