#include<stdio.h>
#include <stdlib.h>
typedef struct bin_node//结点
{
char data;//数据域
struct bin_node* right;//右子树
struct bin_node* left;//左子树
}node;//取小名
int cur;//现在指向的结点
char str[1000];//数组存放遍历字符串
node* create_tree()//创建树
{
cur++;//指向下一个
if(str[cur] == '#')//如果碰到#,则表示该子树是空结点
{
return NULL;
}
node* root = (node*)malloc(sizeof(node));//不是空结点的话,给结点分配空间
root -> data = str[cur];//数据域赋值
root -> left = create_tree();//递归 左子树相同方法创建树
root -> right = create_tree();//递归 右子树相同方法创建树
return root;
}
void preorder_ergodic(node* cur_node)//前序遍历树 传入该结点的地址
{
if(cur_node == NULL)//结点地址为空 没有结点了 返回
return ;
printf ( "%c ", cur_node -> data );//否则 有结点 输出结点数据
preorder_ergodic(cur_node -> left);//递归 左子树相同方法前序遍历树
preorder_ergodic(cur_node -> right);//递归 右子树相同方法前序遍历树
}
void midorder_ergodic(node* cur_node)//中序遍历树
{
if(cur_node == NULL)
return ;
midorder_ergodic(cur_node -> left);
printf("%c ", cur_node -> data);
midorder_ergodic(cur_node -> right);
}
void lateorder_ergodic(node* cur_node)//后序遍历树
{
if(cur_node == NULL)
return ;
lateorder_ergodic(cur_node -> left);
lateorder_ergodic(cur_node -> right);
printf("%c ", cur_node -> data);
}
int len_tree(node* tree)//求树的深度或者叫树的高度 传入树的地址/根节点的地址
{
if(tree == NULL)//树是空的 返回0
return 0;
int lnum = len_tree(tree->left);//递归 求左子树的深度
int rnum = len_tree(tree->right);//递归 求右子树的深度
if(lnum >= rnum)//如果左子树深度更大
return lnum + 1;//返回左子树的深度加上这一层
else//如果右子树深度更大
return rnum + 1;//返回右子树的深度加上这一层
}
int num_node(node* tree)//求树的结点数n
{
if(tree == NULL)//如果是空树
return 0;//返回结点数0
return (num_node(tree->left) + num_node(tree->right) + 1);//否则返回左子树结点数+右子树结点数+自身1
}
int num_zero_node(node* tree)//求树的叶子结点/度为0的数目n0
{
if(tree == NULL)//如果是空树
return 0;//返回叶子结点数0
if(tree->left == NULL && tree->right == NULL)//如果左右子树都是空的
return 1;//返回叶子结点数1
else//如果有子树
return(num_zero_node(tree->left) + num_zero_node(tree->right));//返回左子树和右子树上的叶子结点数
}
int num_one_node(node* tree)//求度为1的结点数n1
{
if(tree == NULL)//如果该结点是空的
return 0;//返回度为1的结点数0
//如果该结点度为1
if((tree->left == NULL && tree->right != NULL) || (tree->left != NULL && tree->right == NULL))
return (1 + num_one_node(tree->left) + num_one_node(tree->right));//返回1+左子树度为1的结点数+右子树度为1的结点数
return(num_one_node(tree->left) + num_one_node(tree->right));//如果左右子树都是空或都有子树,则返回他们左右子树度为1的结点数
}
int num_two_node(node* tree)//求度为2的结点数n2
{
if(tree == NULL)//如果该结点是空的
return 0;//返回度为2的结点数0
//如果该结点度为2
if(tree->left != NULL && tree->right != NULL)
return (1 + num_two_node(tree->left) + num_two_node(tree->right));//返回1+左子树度为2的结点数+右子树度为2的结点数
return(num_two_node(tree->left) + num_two_node(tree->right));//如果左右子树都为空/一空一不空,则返回他们左右子树度为2的结点数
}
int main()
{
char t;
int start = 0;
while(1)
{
scanf("%c", &t);
if(t == '\n')
break;
str[start] = t;
start++;
}
cur = -1;
node* tree = create_tree();
printf("pre_oder:");
preorder_ergodic(tree);
puts("");
printf("mis_oder:");
midorder_ergodic(tree);
puts("");
printf("late_oder:");
lateorder_ergodic(tree);
puts("");
printf("the degree of depth is:%d.\n", len_tree(tree));
printf("the number of the nodes is:%d.\n", num_node(tree));
printf("the number of the zero_nodes is:%d.\n", num_zero_node(tree));
printf("the number of the one_nodes is:%d.\n", num_one_node(tree));
printf("the number of the two_nodes is:%d.\n", num_two_node(tree));
return 0;
}
//示例:abc##de#g##f###
运行结果: