#include
#include
typedef struct BinaryTree{
struct BinaryTree* left;//左指针指向左孩子
struct BinaryTree* right;//右指针指向右孩子
int data;//二叉树节点的数据域
}BT;//给二叉树类型名重定义为BT
//创建一个二叉树
BT* CreatTree(){
//动态开辟所需要的节点
BT* n1=(BT*)malloc(sizeof(BT));
BT* n2=(BT*)malloc(sizeof(BT));
BT* n3=(BT*)malloc(sizeof(BT));
BT* n4=(BT*)malloc(sizeof(BT));
BT* n5=(BT*)malloc(sizeof(BT));
BT* n6=(BT*)malloc(sizeof(BT));
BT* n7=(BT*)malloc(sizeof(BT));
//给各个节点赋值
n1->data = 1;
n2->data = 2;
n3->data = 3;
n4->data = 4;
n5->data = 5;
n6->data = 6;
n7->data = 7;
//让每个节点的左右指针指明方向,创建一个二叉树
n1->left=n2;
n1->right=n3;
n2->left=n4;
n2->right=n5;
n3->left=n6;
n3->right=NULL;
n4->left=n7;
n4->right=NULL;
n5->left=NULL;
n5->right=NULL;
n6->left=NULL;
n6->right=NULL;
n7->left=NULL;
n7->right=NULL;
//形成二叉树后,返回让指针返回根节点
return n1;
}
//先序遍历,先遍历根,再遍历左子树,最后遍历右子树
void PreOrderTraverse(BT* root){
if(!root)
{return ;
}
else{
printf("%d",root->data);
PreOrderTraverse(root->left);
PreOrderTraverse(root->right);
}
}
//中序遍历,先遍历左子树,再遍历根,最后遍历右子树
void InOrderTraverse(BT* root){
if(!root)
{return ;
}
else{
InOrderTraverse(root->left);
printf("%d",root->data);
InOrderTraverse(root->right);
}
}
//后序遍历,先遍历左子树,再遍历右子树,最后遍历根
void PostOrderTraverse(BT* root){
if(!root)
{return ;
}
else{
PreOrderTraverse(root->left);
PreOrderTraverse(root->right);
printf("%d",root->data);
}
}
//求二叉树中叶子结点数
void TreeSize(BT* root)//求二叉树结点个数
{
int size = 0;
if (root == NULL)
{
return;
}
else
{
++size;
printf("%d",size);
}
TreeSize(root->left);
TreeSize(root->right);
}
/*//叶子结点数
int LeavesCount(BT* T)
{
int count = 0;
if (T!= NULL)
{
if ((T->left == NULL) && (T->right== NULL)) count++;
count+=LeavesCount(T->left);
count+=LeavesCount(T->right);
}
printf("%d",count);
return count;
}*/
int main(){
BT* root=CreatTree();
printf("前序遍历:");
PreOrderTraverse( root);
printf("\n");
printf("中序遍历:");
InOrderTraverse( root);
printf("\n");
printf("后序遍历:");
PostOrderTraverse( root);
printf("\n");
printf("二叉树的叶子结点数为:");
TreeSize(root);
printf("二叉树的深度为:");
return 0;
}