下面介绍一下,二叉树的一些常用方法,结合前面写的二叉树的创建和遍历,那么二叉树的基本知识也就差不多了
#include
#include
#define MAXSIZE 10
#include
typedef struct BinaryTree
{
char data;
struct BinaryTree* lchild;
struct BinaryTree* rchild;
}BT;
void Creat_Tree(BT** T)
{
if((*T))
{
char input = 0;
printf("请输入你想要存储的字符:>");
scanf("%c",&input);
getchar();
if(input != 'Q')
{
*T = (BT*)malloc(sizeof(BT));//判断你的输出,如果不是Q,就创建一个结点来存储你的输出
(*T)->data = input;//结点赋值
Creat_Tree(&((*T)->lchild));//创建结点的左孩指针,并根据你的输出,判断是否创建左孩子结点
Creat_Tree(&((*T)->rchild));//创建结点的右孩指针,并根据你的输出,判断是否创建右孩子结点
}
else
{
(*T) = NULL;//如果你输出Q,那么给当前结点赋空值,不再向下添加元素
}
}
}
int CountNode(BT* T)
{
if(!T)
{
return 0;
}
else
return CountNode(T->lchild) + CountNode(T->rchild) + 1;//二叉树的结点数等于它的左边结点数+右边结点数+自己
}
int CountLeaf(BT* T)
{
if(!T)
{
return 0;
}
if(!T->lchild && !T->rchild)//左右孩子都为空,就是叶子结点
{
return 1;
}
return CountLeaf(T->lchild) + CountLeaf(T->rchild);//树左边的叶子结点+右边的叶子结点,就是整个树的叶子结点数
}
void CpyBinaryTree(BT** NewT, BT* T)//用二级指针接收 结点地址的地址
{
if(T)
{
(*NewT) = (BT*)malloc(sizeof(BT));
(*NewT)->data = T->data;
CpyBinaryTree(&((*NewT)->lchild), T->lchild);
CpyBinaryTree(&((*NewT)->rchild), T->rchild);
}
else
{
*NewT = NULL;
}
}
void PrintBT(BT* NewT)
{
if(NewT)
{
printf("%c ", NewT->data);
PrintBT(NewT->lchild);
PrintBT(NewT->rchild);
}
}
int DepthBT(BT* NewT)
{
int m, n;
if(!NewT)
{
return 0;
}
else
{
m = DepthBT(NewT->lchild) + 1;//树的深度为 左边的深度和右边深度的较大者 + 1
n = DepthBT(NewT->rchild) + 1;
}
if(m >= n)return m;
else return n;
}
int main()
{
BT* T;
BT* NewT;
Creat_Tree(&T);//创建二叉树
CountNode(T);//计算二叉树总的结点数
CountLeaf(T);//计算二叉树叶子结点数
CpyBinaryTree(&NewT, T);//复制二叉树,因为要改变NewT,所以要取地址
PrintBT(NewT);//打印二叉树
DepthBT(NewT);//计算树的深度
printf("深度为%d", DepthBT(NewT));
return 0;
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)