二叉树的储存结构包含顺序存储结构和链式存储结构,由于顺序存储结构很容易造成不必要的浪费,本人用的是链式存储结构(注意在实际操作中最后 要释放节点空间)。基本操作包括:遍历二叉树、先序遍历的顺序建立二叉树、复制二叉树、计算二叉树深度、计算二叉树结点个数。下面讲一下实现代码:
首先是定义结构类型:
typedef struct BiTNode{
ElemType data;
BiTNode *lchild;
BiTNode *rchild;
}BiTNode,*BiTree;
遍历二叉树:
void InOrderTraverse(BiTree T)
{
if (T)
{
InOrderTraverse(T->lchild);
printf("%c ", T->data);
InOrderTraverse(T->rchild);
}
}
判断T是否为空,如果T不为空树,则递归读取左子树,输出当前根节点的数据,递归读取右子树。
序遍历的顺序建立二叉树:
BiTNode *CreateBiTree(BiTree T)
{
ElemType ch;
scanf("%c", &ch);
if (ch == '#')
T = NULL;
else
{
T = (BiTNode *)malloc(sizeof(BiTNode));
T->data = ch;
T->lchild = CreateBiTree(T->lchild);
T->rchild = CreateBiTree(T->rchild);
}
return T;
}
该函数将#作为空的标志,当输入的字符为#的时候,T为空树。如果不为空,先为T动态分配BiTNode类型的空间,将输入字符的值赋值给树T的数据域,递归调用CreateBiTree()来输入T的左右子树的数据。注意必须返回T的地址。
复制二叉树:
BiTNode *Copy(BiTree T, BiTree NewT)
{
if (T == NULL)
NewT = NULL;
else
{
NewT = (BiTNode *)malloc(sizeof(BiTNode));
NewT->data = T->data;
NewT->lchild = Copy(T->lchild, NewT->lchild);
NewT->rchild = Copy(T->rchild, NewT->rchild);
}
return NewT;
}
复制和创建个人觉得逻辑上是差不多的,只是将旧树T的data赋值给新树NewT的data,然后递归实现对左右子树的复制。
求二叉树树的深度:
int Depth(BiTree T)
{
int m, n;
if (T == NULL)
return 0;
else
{
m = Depth(T->lchild);
n = Depth(T->rchild);
if (m > n)
return (m + 1);
else
return (n + 1);
}
}
先判断数是否为空,如果为空,深度为0,则返回0。如果不为空,让m等于左子树的深度,n等于右子树的深度,如果大于n则返回m+1(子树的深度加上当前根等于树的深度),否则返回n+1。
求节点数:
int NodeCount(BiTree T)
{
if (T == NULL)
return 0;
else
return NodeCount(T->lchild) + NodeCount(T->rchild) + 1;
}
判断T是否为空树,如果是的话,返回0,此时节点数为0个。如果不是,返回T的左子树节点数、右子树节点数、当前节点的和,得到所有节点的数量。
加入main():
int main(void)
{
BiTree T, NewT;
int n, dep, num;
T = NULL;
NewT = NULL;
printf("1.遍历二叉树\n2.建立二叉树\n3.复制二叉树\n4.计算二叉树的深度\n5.计算节点的个数\n6.退出\n");
while (1)
{
printf("请选择:");
scanf("%d",&n);
switch (n)
{
case 1:
InOrderTraverse(T);
printf("\n");
break;
case 2:
fflush(stdin);
T = CreateBiTree(T);
break;
case 3:
NewT = Copy(T,NewT);
InOrderTraverse(NewT);
printf("\n");
break;
case 4:
dep = Depth(T);
printf("深度为:%d\n",dep);
break;
case 5:
num = NodeCount(T);
printf("节点数为:%d\n",num);
break;
case 6:
exit(0);
}
}
return 0;
}