#include<stdio.h> #include<stdlib.h> typedef char elementType;
typedef struct TreeNode{
elementType data;
struct TreeNode *left;
struct TreeNode *right;
} Node,*BNode;
// 定义树先序创建函数
void CreatTree(BNode *Root) {
// 用于下面存放数据,输入多个字符,每次只取一个,其余的缓存在键盘的缓冲区 char val=getchar();
// 如果输入'*',则指向为空
if (val == '*')
(*Root) = NULL;
// 如果输入非'*',则给数据域赋值
else {
(*Root) = (BNode)malloc(sizeof(Node)); // 申请内存空间
if ((*Root) == NULL) {
printf("创建节点失败");
exit(-1);
}
else {
(*Root)->data = val; // 给节点数据域赋值
CreatTree(&(*Root)->left);
printf("创建左子树\n");
CreatTree(&(*Root)->right);
printf("创建右子树\n");
}
}
}
//先序遍历 void preOrder(BNode head){
//如果遇到空,带表这个树遍历完成
if(head==NULL){
return;
}else{
//先打印根节点
printf("%-3c",head->data);
//遍历左子树
preOrder(head->left);
//遍历右子树
preOrder(head->right);
} }
//中序遍历
void centerOrder(BNode head){
//如果遇到空,带表这个树遍历完成
if(head==NULL){
return;
}else{
//遍历左子树
preOrder(head->left);
//遍历根节点
printf("%-3c",head->data);
//遍历右子树
preOrder(head->right);
} }
//后序遍历
void lastOrder(BNode head){
//如果遇到空,带表这个树遍历完成
if(head==NULL){
return;
}else{
//遍历左子树
preOrder(head->left);
//遍历右子树
preOrder(head->right);
//先打印根节点
printf("%-3c",head->data);
} }
//1求二叉树的高度
int height(BNode head){
int left=0;
int right=0;
if(head==NULL)
return 0;
left = height(head->left);
right = height(head->right);
return left>right?left+1:right+1;
}
//求叶子节点的个数
int count_leaf(BNode head){
if(head==NULL)
return 0;
if(head->left==NULL&&head->right==NULL)
return 1;
return count_leaf(head->left)+count_leaf(head->right);
}
int main(){
BNode p;
CreatTree(&p);
preOrder(p);
centerOrder(p);
lastOrder(p);
int x=height(p);
printf("%d\n",x);
int leaf=count_leaf(p);
printf("%d\n",leaf);
return 0;
}