#include<stdio.h>
#include<math.h>
int Bdepth(BiTree b)
{ //求二叉树的高度
int ldepth,rdepth;
if(b==NULL)
return 0;
ldepth = Bdepth(b->lchild);
rdepth = Bdepth(b->rchild);
return (ldepth>rdepth)?(ldepth+1):(rdepth+1);
}
int Bignodes(BiTree b,Elemtype x)
{//求二叉树b中所有大于x结点的值的个数
int num1,num2,num=0;
if(b==NULL)
return 0;
num1 = Bignodes(b->lchild,x);
num2 = Bignodes(p->rchild,x);
num += num1+num2;
if(b->data>x) //if(b->data<x)变成求小于x结点值的个数
num++;
return num;
}
/*统计二叉树中第k层结点的个数
思想:采用先序遍历的递归算法,num初值为0,若当前访问结点b是第k层上的叶子节点
则num++,再求出左右子树第k层上的叶子节点个数num1,num2,最后返回num1+num2*/
int Lnodes(BiTree b,int h,int k,int n)
{
//h是b所在的层数,初值为1,n是第k层结点的个数,初值为0
if(b==NULL)
return 0;
else
{
if(h==k) n++;
else if
{
Lnodes(b->lchild,h+1,k,n);
Lnodes(b->rchild,h+1,k,n);
}
}
}
int LevelLnodes(BiTree b,int k)
{
return Lnodes(b,1,k,0);
}
int Leafnums(BiTree b,int h,int k)
{ //求二叉树第k层上叶子结点的个数
int num1,num2,num=0;
if(b==NULL)
return 0;
else
{
if(h==k&&b->lchild==NULL&&b-rchild==NULL)
num++;
num1 = Leafnums(b->lchild,h+1,k,n);
num2 = Leafnums(b->lchild,h+1,k,n);
num += num1+num2;
return num;
}
}
int LevelLeafk(BiTree b,int k) //求b中第k层上的叶子结点的个数
{
return Leafnums(b,1,k);
}
void FindMinNode(BiTree b,char min)
{ //求二叉树最小值的结点值
if(b->data<x)
min = b->data;
FindMinNode(b->lchild,min); //在左子树中找最小值结点值
FindMinNode(b->rchild,min); //在右子树中找最小值结点值
}
void MinNode(BiTree b) //输出最小结点值
{
if(b!=NULL)
{
char min = b->data;
FindMinNode(b,min);
printf("Min = %c",min);
}
}
void FindMaxNode(BiTree b,char Max)
{ //求二叉树中最大值的结点
if(b->data>Max)
Max = b->data;
FindMaxNode(b->lchild,Max);
FindMaxNode(b->rchild,Max);
}
void MaxNode(BiTree b)
{
char max = b->data;
FindMaxNode(b,max);
printf("Max = %c\n",max);
}