#include<stdio.h>
typedef struct Node{
char data;
struct Node *LChild;
struct Node *RChild;
}BiTNode,*BiTree;
void CreateBiTree(BiTree *bitree){
char c = getchar();
if(c == '.') (*bitree) = NULL;
else
{
(*bitree) = (BiTree)malloc(sizeof(BiTNode));
(*bitree) ->data = c;
CreateBiTree(&((*bitree)->LChild));
CreateBiTree(&((*bitree)->RChild));
}
}
//先序遍历二叉树
void PreOrder(BiTree root)
{
if(root != NULL){
//访问根节点
printf("%c",root->data);
//遍历左子树
PreOrder(root->LChild);
//遍历右子树
PreOrder(root->RChild);
}
}
//中序遍历二叉树
InOrder(BiTree root)
{
if (root!=NULL){
//遍历左子树
InOrder(root ->LChild);
//访问根节点
printf("%c",root ->data);
//遍历右子树
InOrder(root ->RChild);
}
}
//后序遍历二叉树
void PostOrder(BiTree root)
{
if(root!=NULL){
//遍历左子树
PostOrder(root ->LChild);
//遍历右子树
PostOrder(root ->RChild);
//访问根结点
printf("%c",root ->data);
}
}
//先序遍历输出二叉树结点, root为指向二叉树根结点的指针
void PreOrder1(BiTree root)
{
if (root!=NULL)
{
//访问根结点
printf("%c",root ->data);
//先序遍历左子树
PreOrder(root ->LChild);
//先序遍历右子树
PreOrder(root ->RChild);
}
}
//先序遍历输出二叉树中的叶子结点 , root为指向二叉树根结点的指针
void PreOrder2(BiTree root)
{
if (root!=NULL)
{
if (root ->LChild==NULL && root ->RChild==NULL)
//输出叶子结点
printf("%c",root ->data);
//先序遍历左子树
PreOrder(root ->LChild);
//先序遍历右子树
PreOrder(root ->RChild);
}
}
int leaf(BiTree root)
{
int LeafCount;
if(root==NULL)
LeafCount =0;
else if ((root->LChild==NULL)&&(root->RChild==NULL))
LeafCount =1;
else
LeafCount =leaf(root->LChild)+leaf(root->RChild);
return LeafCount;
}
//后序遍历求二叉树bt高度的递归算法
int PostTreeDepth(BiTree bt)
{
int hl, hr, max;
if(bt!=NULL)
{
//求左子树的深度
hl=PostTreeDepth(bt->LChild);
//求右子树的深度
hr=PostTreeDepth(bt->RChild);
//比较
max=hl>hr?hl:hr;
return(max+1);
}
else return(0);
}
int Hmax=0;
void PreTreeDepth(BiTree bt, int h)
{
if(bt==NULL) return ;
if(bt->LChild==NULL&&bt->RChild==NULL)
{
Hmax = Hmax>h ? Hmax:h;
}
//遍历左子树
PreTreeDepth(bt->LChild, h+1);
//遍历右子树
PreTreeDepth(bt->RChild, h+1);
}
int main()
{
BiTree tree;
CreateBiTree(&tree);
printf("PreOrder:\n");
PreOrder(tree);
printf("\nInOrder:\n");
InOrder(tree);
printf("\nPostOrder:\n");
PostOrder(tree);
printf("\nPreOrder1:\n");
PreOrder1(tree);
printf("\nPreOrder2:\n");
PreOrder2(tree);
printf("叶子数:%d\n",leaf(tree));
printf("后序遍历求二叉树的高度:%d\n",PostTreeDepth(tree));
Hmax=0;
PreTreeDepth(tree,1);
printf("\nPreTreeDepth: % d\n",Hmax);
return 0;
}
二叉树的算法
最新推荐文章于 2022-03-13 15:20:37 发布
这篇博客介绍了如何创建二叉树,并通过C语言实现了先序、中序、后序三种遍历方法,同时提供了计算二叉树叶子结点数量及高度的功能。示例代码展示了这些操作的具体实现。
摘要由CSDN通过智能技术生成