一、先序遍历统计二叉树中的结点数:
void PreOrder(BiTree root)//先序遍历统计结点个数
{
if(root)
{
count++;//count是全局变量,初始值为0
PreOrder(root->Lchild);
PreOrder(root->Rchild);
}
}
二、输出二叉树中的叶子结点:
因为三种遍历算法输出的是一样的,下面采用中序遍历:
void InOrder(BiTree root)//中序遍历输出叶子结点
{
if(root)
{
InOrder(root->Lchild);
if(root->Lchild==NULL&&root->Rchild==NULL)
printf("%c",root->data);//输出的叶子结点
InOrder(root->Rchild);
}
}
三、统计叶子结点的数目(采用后序遍历):
方法一:使用全局变量:
void PostOrder(BiTree root)//后序遍历统计叶子结点的数目1
{
if(root)
{
PostOrder(root->Lchild);
PostOrder(root->Rchild);
if(root->Lchild==NULL&&root->Rchild==NULL)
count++;//全局变量统计叶子结点的数目,初始值为0
}
}
方法二:通过函数返回值方法:
int leaf(BiTree root)//后序遍历统计叶子结点的数目2
{
int n=0,nl,nr;
if(root==NULL)
return 0;
if(root->Lchild==NULL&&root->Rchild==NULL)
return 1;
nl=leaf(root->Lchild);
nr=leaf(root->Rchild);
n=nl+nr;
return n;
}
四、求二叉树的高度
方法一:使用全局变量求二叉树的高度:
void Hight(BiTree root,int h)//全局变量求二叉树的高度
{
if(root)
{
//h是root结点所在的层次,初始值为1
if(h>depth)
depth=h;//depth是全局变量,记录求得最大的层数,初始值为0
Hight(root->Lchild,h+1);
Hight(root->Rchild,h+1);
}
}
方法二:通过函数返回值的方法:
int High(BiTree root)//利用,函数返回值求二叉树的高度
{
int hl,hr,h=0;
if(root==NULL)
return 0;
else
{
hl=High(root->Lchild);
hr=High(root->Rchild);
h=(hl>hr?hl:hr)+1;
return h;
}
}
五、求二叉树中结点的双亲:
算法思想:遍历这棵二叉树,若当前结点为空,则没有双亲结点;若当前结点非空或者当前结点的左孩子或者右孩子等于所求结点,则当前结点就是所求结点的双亲结点;若不是,可在左子树中先找,找到当前结点的左孩子等于所求结点,则找到,否则,可在当前结点的右子树中找,找到当前结点的右孩子等于所求结点,则已找到。
BiTree Parent(BiTree root ,BiTree q)//求结点q的双亲
{
BiTree p;
if(root==NULL)
return NULL;
if(root->Lchild==q||root->Rchild==q)
return root;
else
{
p=Parent(root->Lchild,q);
if(p!=NULL)
return p;
else
return (Parent(root->Rchild,q));
}
}
六、二叉树的相似性判定:
int like(BiTree t1,BiTree t2)//二叉树的相似性判定
{
int likel,liker;
if(t1==NULL&&t2==NULL)
return 1;
else if(t1==NULL||t2==NULL)
return 0;
else
{
likel=like(t1->Lchild,t2->Lchild);
liker=like(t1->Rchild,t2->Rchild);
return (likel&&liker);
}
}