建立一个二叉树,求其高度,首先前、中、后序遍历,求叶子数,求树深度并且判断是否为平衡二叉树。
二叉树是一个典型的数据结构,华为往年的试题中也有考到这个知识点的。
下面介绍几个树的重要性质:
性质1 二叉树第i层上的结点数目最多为2^(i-1)(i≥1)。
性质2 深度为k的二叉树至多有2^k-1个结点(k≥1)。
性质3 在任意-棵二叉树中,若终端结点的个数为n0,度为2的结点数为n2,则n0=n2+1。
#include <stdio.h>
#include <stdlib.h>
// 二叉树结构体
typedef struct BiTNode
{
char data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
// 创建二叉树
int CreateBiTree( BiTree &T )
{
char ch;
ch=getchar();
if( ch == ‘#‘ )
T=NULL;
else
{
if( ! ( T = ( BiTree )malloc( sizeof( BiTNode ) ) ) )
exit( 0 );
T->data = ch;
CreateBiTree( T->lchild );
CreateBiTree( T->rchild );
}
return 0;
}
// 二叉树输出
void Visit(BiTree T)
{
if(T->data != ‘#‘)
{
printf("%c ",T->data);
}
}
// 先序遍历
void PreOrder(BiTree T)
{
if( T!=NULL )
{
Visit(T);
PreOrder(T->lchild);
PreOrder(T->rchild);
}
}
// 中序遍历
void InOrder(BiTree T)
{
if( T!=NULL )
{
InOrder(T->lchild);
Visit(T);
InOrder(T->rchild);
}
}
// 后序遍历
void PostOrder(BiTree T)
{
if( T!=NULL )
{
PostOrder(T->lchild);
PostOrder(T->rchild);
Visit(T);
}
}
// 求二叉树叶子数
int sumleaf( BiTree T )
{
if( T!=NULL )
{
if( T->lchild || T->rchild )
return( sumleaf( T->lchild ) + sumleaf( T->rchild ) );
else
return 1;
}
return 0;
}
// 返回两个整数中较大的一个
int themax( int a, int b )
{
if( a>b )
return a;
else
return b;
}
// 求二叉树的深度
int Depth( BiTree T )
{
if( T!=NULL )
return( 1 + themax( Depth( T->lchild ), Depth( T->rchild ) ) );
return 0;
}
// 判断二叉树是否为平衡二叉树
// 平衡二叉树:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。
bool bebalance( BiTree T )
{
if( T==NULL )
return true;
int ld=Depth(T->lchild);
int lr=Depth(T->rchild);
int di=abs(ld-lr);
if(di>1) //根节点平衡
return false;
return bebalance(T->lchild) && bebalance(T->rchild); //左右子树平衡
}
int main()
{
BiTree T;
CreateBiTree(T);
printf("先序遍历:\n");
PreOrder(T);
printf("\n");
printf("中序遍历:\n");
InOrder(T);
printf("\n");
printf("后序遍历:\n");
PostOrder(T);
printf("\n");
printf("二叉树叶子数: %d\n", sumleaf( T ) );
printf("二叉树深度: %d\n" , Depth( T ) );
if(bebalance(T))
printf("此二叉树是平衡二叉树\n");
else
printf("此二叉树不是平衡二叉树\n");
return 0;
}
原文地址:http://blog.csdn.net/wtyvhreal/article/details/46672835