二叉树是树中最简单的一种形式,每棵树也都可以通过子兄排列为二叉树形式,则下面将介绍二叉树的一些基本操作,分别是创建,复制,深度计算,节点计算以及叶子计算
二叉树的创建
一下提供了手动输入字符的方法来创建一个存放字符的二叉树,并规定当输入#时,标志着该节点为空
Bitree* InitBitRootNode() {
Bitree* T = (Bitree*)malloc(sizeof(Bitree));
T->lchild = T->rchild = NULL;
return T;
}
void CreatBitNode(Bitree** T) {
char data;
scanf("%c", &data);
getchar(); //清空缓冲区,否则enter建也会被当作一个输入
if (data == '#')
(*T) = NULL;
else {
(*T) = InitBitRootNode();
(*T)->data = data;
CreatBitNode(&((*T)->lchild));
CreatBitNode(&((*T)->rchild));
}
}
之所以采用双指针形参,是为了当输入#时使节点变为空,若采用单指针形式,则对T本身来说相当于传值调用,调用结束后不会改变T的值
二叉树的拷贝
Bitree* CopyBitree(Bitree* T) {
Bitree* newT = InitBitRootNode();
if (!T) {
newT = T;
return newT;
}
else {
newT->data = T->data;
newT->lchild = CopyBitree(T->lchild);
newT->rchild = CopyBitree(T->rchild);
}
return newT;
}
二叉树的拷贝采用递归算法,首先判断传入的被拷贝参数是否为空,若为空则返回空指针
否则,创建一个新的树节点存放被拷贝节点数值,并对新节点的左右子节点也分别拷贝
二叉树深度的计算
int Depth(Bitree* T) {
if (!T)
return 0;
else {
int i = Depth(T->lchild);
int j = Depth(T->rchild);
return (i > j ? i : j) + 1;
}
}
采用递归算法,从根节点开始一直搜索到叶子节点,然后开始返回值,返回值是已找到的最大深度加一,加一是因为自己这个节点代表了一个层数
二叉树节点的计算
int BiTreeNodeCount(Bitree* T) {
if (!T)
return 0;
else
return BiTreeNodeCount(T->lchild) + BiTreeNodeCount(T->rchild) + 1;
}
二叉树叶子的计算
int BiTreeLeaftCount(Bitree* T) {
if (!T)
return 0;
else if (T->lchild == NULL && T->rchild == NULL)
return 1;
else
return BiTreeLeaftCount(T->lchild) + BiTreeLeaftCount(T->rchild);
}
相对于计算节点数,计算叶子数需要判断的不仅有该节点是否为空,还要判断该节点的左右子节点是否为空,若该节点为空,则说明该节点为叶子节点的子节点,已经没有递归的必要;若左右子节点为空则说明该节点是一个叶子,返回数值一,否则进入递归
效果展示