#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
typedef struct node{
char data;
struct node *Lchild;
struct node *rchild;
}BiTnode;
//统计结点总数
int count1=0;
//统计叶子结点数目的全局变量
int count2=0;
//统计层数
int depth=0;
//先序建立二叉树
BiTnode *Create_Tree(){
//定义输入变量
char ch;
BiTnode *root;
scanf("%c",&ch);
if(ch=='#') root=NULL;
else{
root=(BiTnode *)malloc(sizeof(BiTnode));
root->data=ch;
root->Lchild=Create_Tree();
root->rchild=Create_Tree();
}
return root;
}
//线序遍历二叉树
void Preorder(BiTnode *root){
if(root){
printf("%c",root->data);
Preorder(root->Lchild);
Preorder(root->rchild);
}
}
//中序遍历二叉树
void Inorder(BiTnode *root){
if(root){
Inorder(root->Lchild);
printf("%c",root->data);
Inorder(root->rchild);
}
}
//后续遍历二叉树
void PostOrder(BiTnode *root){
if(root){
PostOrder(root->Lchild);
PostOrder(root->rchild);
printf("%c",root->data);
}
}
//统计结点个数
void PreOrder_Coutnode(BiTnode *root){
if(root){
count1++;
PreOrder_Coutnode(root->Lchild);
PreOrder_Coutnode(root->rchild);
}
}
//输出叶子结点
void Inorder_Printleaf(BiTnode *root){
if(root){
Inorder_Printleaf(root->Lchild);
if(root->Lchild==NULL&&root->rchild==NULL){
printf("%c",root->data);
}
Inorder_Printleaf(root->rchild);
}
}
//统计叶子结点的个数--后序遍历
void PostOrder_CouLeaf(BiTnode *root){
if(root){
PostOrder_CouLeaf(root->Lchild);
PostOrder_CouLeaf(root->rchild);
if(root->Lchild==NULL&&root->rchild==NULL){
count2++;
}
}
}
//统计树的高度
int TreeDepth(BiTnode *root){
int hl,hr,h;
if(root==NULL) return 0;
else{
hl=TreeDepth(root->Lchild);
hr=TreeDepth(root->rchild);
h=(hl>hr?hl:hr)+1;
return h;
}
}
int main(){
BiTnode *root;
printf("请输入要构成的二叉树的值:");
root=Create_Tree();
printf("先序遍历结果如下:\n");
Preorder(root);
printf("\n");
printf("中序遍历结果如下:\n");
Inorder(root);
printf("\n");
printf("后序遍历结果如下:\n");
PostOrder(root);
printf("\n");
PreOrder_Coutnode(root);
printf("\n二叉树的结点数为: %d\n",count1);
PostOrder_CouLeaf(root);
printf("\n叶子结点总数为: %d\n",count2);
printf("叶子结点有:");
Inorder_Printleaf(root);
int heigh=TreeDepth(root);
printf("\n树的高度为: %d\n",heigh);
return 0;
}
二叉树相关操作
最新推荐文章于 2022-10-25 17:24:40 发布