#include <stdlib.h>
#include <conio.h>
#include <stdio.h>
#include <stdbool.h>
struct BiTNode {
int data;
struct TreeNode *lchild,*rchild;
}BiTNode, *BiTree;
//输出二叉树的所有结点个数
int Put(BiTree b)
{
if(b==NULL)
return 0;
else
return Put(b->lchild)+Put(b->rchild)+1;
}
//计算二叉树中双分支结点的个数
int Double(BiTree b)
{
if(b==NULL)
return 0; //返回的树的高度为0
if(b->lchild!=NULL&&b->rchild!=NULL)
return Double(b->lchild)+Double(b->rchild)+1;
else
return Double(b->lchild)+Double(b->rchild);
}
//计算二叉树中单分支结点的个数
int Single(BiTree b)
{
if(b==NULL)
return 0;
if((b->lchild!=NULL)&&(b->rchild==NULL)||(b->lchild==NULL)&&(b->rchild!=NULL))
return Single(b->lchild)+Single(b->rchild)+1;
else
return Single(b->lchild)+Single(b->rchild);
}
//输出二叉树中的所有叶子节点
void Putleaf(BiTree b)
{
if(b!=NULL)
{
if(b->lchild=NULL&&b->rchild=NULL) //若是叶子节点递归输出
printf("%c",b->data);
Putleaf(b->lchild);//其他结点
Putleaf(b->rchild);
}
}
//输出二叉树中的所有双分支结点
int Pdouble(BiTree b)
{
if(b!=NULL)
{
if(b->lchild!=NULL&&b->rchild!=NULL) //若是叶子节点递归输出
printf("%c",b->data);
Putleaf(b->lchild);//其他结点
Putleaf(b->rchild);
}
}
//求二叉树第k层结点个数
void Lnodenum((BiTree b,int h,int k,int &n)
{ //h表示b所指的结点层次,初值为1
if(b==NULL)
return;
else //处理非空树
{
if(h==k) n++; //当访问的结点在第k层时n增1
else //若当前访问的结点层次小于k,递归处理左右子树
{
Lnode(b->lchild+1,h+1,k,n);
Lnode(b->rchild+1,h+1,k,n);
}
}
}
int n=0; //全局变量,用于记录第k层结点的个数
void Lnodenum(BiTree b,int h,int k)
{ //h表示b所指的结点层次
if(b==NULL)
return;
else
{
if(h==k) n++;
else if(h<k)
{
Lnode(b->lchild,h+1,k);
Lnode(b->rchild,h+1,k);
}
}
}
//删除二叉树中以元结点值x为的根节点的子树
void Del(BiTree b,Elemtype x)
{ //基于先序遍历的递归算法,先找到值为x的结点p,然后调用DestoryBTree(p)删除并释放该子树
if(b==NULL)
return;
if(b->data==x)
{
DestoryBTree(b);
b = NULL;
}
else
{
Del(b->lchild,x);
Del(b->rchlid,x);
}
}
void DestoryBTree(BiTree &b)
{ //释放二叉树b中所有结点分配的空间
if(b!=NULL)
{
DestoryBTree(b->lchild);
DestoryBTree(b->rchild);
free(b);
}
}
//求先序遍历序列中的第k(1<=k<=二叉树中结点的个数)个结点的值
int i=1; //遍历序号的全局变量
Elemtype Search(BiTree b,int k)
{
if(b==NULL)
return '#';
if(i==k)
return b->data;
i++;
ch = Search(b->lchild,k);
if(ch!='#')
return ch;
ch = Search(b->rchild,k);
return ch;
}
/*
设置一个全局变量记录已访问的结点的序号,其初值是根节点在先序序列中的序号,即1.
当二叉树为空时,返回'#',当i==k时返回b->data,
当i!=k时递归的在左子树中查找,若找到返回该值,否则继续递归右子树查找,并返回其结果
*/
//判断两棵二叉树是否相似的算法
bool Like(BiTree b1,BiTree b2)
{
bool like1,like2;
if(b1==NULL&&b2==NULL)
return true;
else if((b1==NULL||b2==NULL)
return false;
else
{
like1 = Like(b1->lchild,b2->lchild);
like2 = Like(b1->rchild,b2->rchild);
return (like1&&like2); //返回like1,like2与运算的结果
}
}
//判断一棵二叉树b的左右子树是否同构
bool Like(BiTree b1,BiTree b2) //判断二叉树b1,b2是否同构
{
bool like1,like2;
if(b1==NULL&&b2==NULL)
return true;
else if(b1==NULL||b2==NULL)
return false;
else
{
like1 = Like(b1->lchild,b2->lchild);
like2 = Like(b1->rchild,b2->rchild);
return (like1&&like2);
}
}
bool LikeBiTree(BiTree b) //判断二叉树的左右子树是否同构
{
if(b==NUL)
return true;
else
return Like(b->lchild,b->rchild);
}