#include <stdio.h>
#include <stdlib.h>
//定义二叉树的结点
typedef struct Node
{
char data;
struct Node * LChild;
struct Node * RChild;
}BiTNode,* BiTree;
//创建二叉树列表
void CreateBiTree(BiTree * bt)
{
char ch;
ch = getchar();
if(ch == '.')
{
*bt = NULL;
}
else
{
* bt = (BiTree)malloc(sizeof(BiTNode));
(*bt)->data = ch;
CreateBiTree(&((*bt)->LChild));
CreateBiTree(&((*bt)->RChild));
}
}
//遍历二叉树
void PreOrder(BiTree root){
/*先序遍历二叉树, root为指向二叉树(或某一子树)根结点的指针*/
if(root != NULL){
printf("%c",root->data); /*输出根节点*/
PreOrder(root->LChild); /*先序遍历左子树*/
PreOrder(root->RChild); /*先序遍历右子树*/
}
}
void InOrder(BiTree root)
/*中序遍历二叉树, root为指向二叉树(或某一子树)根结点的指针*/
{ if (root!=NULL){
InOrder(root ->LChild); /*中序遍历左子树*/
printf("%c",root->data); /*访问根结点*/
InOrder(root ->RChild); /*中序遍历右子树*/
}
}
void PostOrder(BiTree root)
/* 后序遍历二叉树,root为指向二叉树(或某一子树)根结点的指针*/
{ if(root!=NULL){
PostOrder(root ->LChild); /*后序遍历左子树*/
PostOrder(root ->RChild); /*后序遍历右子树*/
printf("%c",root->data); /*访问根结点*/
}
}
//遍历二叉树的叶子结点
void Pre(BiTree root )
{
if(root != NULL)
{
if(root ->LChild==NULL &&root->RChild==NULL)
{
printf("%c",root->data);
}
PreOrder(root ->LChild);//便利左子数
PreOrder(root ->RChild);//遍历右子数
}
}
//统计叶子结点数
int LeafCount = 0;
void leaf(BiTree root)
{
if(root !=NULL)
{
leaf(root ->LChild);
leaf(root ->RChild);
if(root ->LChild ==NULL&& root ->RChild==NULL)
{
LeafCount++;
}
}
}
//二叉树的高度
int depth = 1;
void PreTreeDepth(BiTree bt, int h)
{
if(bt != NULL)
{
if(h > depth)
{
depth = h;//如果节点层次大于depth,更新depth
}
PreTreeDepth(bt->LChild,h+1);
PreTreeDepth(bt->RChild,h+1);
}
}
int main()
{
BiTree t;
CreateBiTree(&t);
printf("先序二叉树:");
PreOrder(t);
printf("\n");
printf("中序二叉树:");
InOrder(t);
printf("\n");
printf("后序二叉树:");
PostOrder(t);
printf("\n");
printf("叶子结点是:");
Pre(t);
printf("\n");
printf("叶子结点数是:");
leaf(t);
printf("%d\n",LeafCount);
PreTreeDepth(t,depth);
printf("二叉树的高度是:%d\n",depth);
return 0;
}
#include <stdlib.h>
//定义二叉树的结点
typedef struct Node
{
char data;
struct Node * LChild;
struct Node * RChild;
}BiTNode,* BiTree;
//创建二叉树列表
void CreateBiTree(BiTree * bt)
{
char ch;
ch = getchar();
if(ch == '.')
{
*bt = NULL;
}
else
{
* bt = (BiTree)malloc(sizeof(BiTNode));
(*bt)->data = ch;
CreateBiTree(&((*bt)->LChild));
CreateBiTree(&((*bt)->RChild));
}
}
//遍历二叉树
void PreOrder(BiTree root){
/*先序遍历二叉树, root为指向二叉树(或某一子树)根结点的指针*/
if(root != NULL){
printf("%c",root->data); /*输出根节点*/
PreOrder(root->LChild); /*先序遍历左子树*/
PreOrder(root->RChild); /*先序遍历右子树*/
}
}
void InOrder(BiTree root)
/*中序遍历二叉树, root为指向二叉树(或某一子树)根结点的指针*/
{ if (root!=NULL){
InOrder(root ->LChild); /*中序遍历左子树*/
printf("%c",root->data); /*访问根结点*/
InOrder(root ->RChild); /*中序遍历右子树*/
}
}
void PostOrder(BiTree root)
/* 后序遍历二叉树,root为指向二叉树(或某一子树)根结点的指针*/
{ if(root!=NULL){
PostOrder(root ->LChild); /*后序遍历左子树*/
PostOrder(root ->RChild); /*后序遍历右子树*/
printf("%c",root->data); /*访问根结点*/
}
}
//遍历二叉树的叶子结点
void Pre(BiTree root )
{
if(root != NULL)
{
if(root ->LChild==NULL &&root->RChild==NULL)
{
printf("%c",root->data);
}
PreOrder(root ->LChild);//便利左子数
PreOrder(root ->RChild);//遍历右子数
}
}
//统计叶子结点数
int LeafCount = 0;
void leaf(BiTree root)
{
if(root !=NULL)
{
leaf(root ->LChild);
leaf(root ->RChild);
if(root ->LChild ==NULL&& root ->RChild==NULL)
{
LeafCount++;
}
}
}
//二叉树的高度
int depth = 1;
void PreTreeDepth(BiTree bt, int h)
{
if(bt != NULL)
{
if(h > depth)
{
depth = h;//如果节点层次大于depth,更新depth
}
PreTreeDepth(bt->LChild,h+1);
PreTreeDepth(bt->RChild,h+1);
}
}
int main()
{
BiTree t;
CreateBiTree(&t);
printf("先序二叉树:");
PreOrder(t);
printf("\n");
printf("中序二叉树:");
InOrder(t);
printf("\n");
printf("后序二叉树:");
PostOrder(t);
printf("\n");
printf("叶子结点是:");
Pre(t);
printf("\n");
printf("叶子结点数是:");
leaf(t);
printf("%d\n",LeafCount);
PreTreeDepth(t,depth);
printf("二叉树的高度是:%d\n",depth);
return 0;
}