5.6.1二叉树的建立
本文按先序遍历序列的方式建立二叉树的二叉链表。
(1)从键盘输入二叉树的结点信息,建立二叉树的存储结构。
(2)在建立二叉树的过程中按照二叉树的先序方式建立

对上图所示二叉树,按下列顺序读入字符:
ABC##DE#G##F###
void CreateBiTree(BiTree *T)
{
ElemType ch;
scanf("%c", &ch);
if (ch == "#")
*T = NULL;
else
{
*T = (BiTree)malloc(sizeof(BiTNode));
if (!*T)
exit(OVERFLOW);
(*T)->data = ch;
CreateBiTree(&(*T)->lchild); //构建左子树
CreateBiTree(&(*T)->rchild); //构建右子树
}
}
5.6.2 复制二叉树
如果是空树,递归结束,否则申请新结点空间,复制根结点,递归复制左子树,递归复制右子树。
int Copy(BiTree T, BiTree *newT)
{
if (T == NULL)
return 0;
else
{
*newT = (BiTree)malloc(sizeof(BiTNode));
*newT->data = T->data;
copy(T->lchild, &(*newT)->lchild); //复制左子树
copy(T->lchild, &(*newT)->lchild); //复制右子树
}
return 1;
}
5.6.3 计算二叉树的深度
如果是空树,则深度为0,否则递归计算左子树的深度记为m,递归计算右子树的深度记为n,二叉树的深度为m与n的较大者加1。
int Depth(BiTree T)
{
if (T == NULL)
return 0;
else
{
m = Depth(T->lchild);
n = Depth(T->rchild);
if (m > n)
return m+1;
else
return n+1;
}
}
5.6.4 计算二叉树结点总数
如果是空树,则结点数为0,否则结点数为左子树的结点个数+右子树的结点个数+1。
int NodeCount(BiTree T)
{
if (T == NULL)
return 0;
else
return NodeCount(T->lchild) + NodeCount(T->rchild) + 1;
}
5.6.5 计算二叉树叶子结点个数
如果是空树,则叶子结点个数为0,否则叶子结点个数是左子树的叶子结点个数 + 右子树的叶子结点个数。
int LeafCount(BiTree T)
{
if (T == NULL)
return 0;
if (T->lchild == NULL && T->rchild == NULL)
return 1;
else
{
return LeafCount(T->lchild) + LeafCount(T->rchild);
}
}
本文介绍了如何通过先序遍历序列建立二叉树的二叉链表结构,并提供了创建、复制、计算深度、节点计数及叶子结点计数的算法实现。具体包括:从键盘输入建立二叉树,按照先序遍历方式;复制二叉树时,逐层复制节点;计算二叉树深度,通过比较左右子树深度得到;计算结点总数,递归累加左右子树节点数及根节点;计算叶子结点个数,若无子树则为叶子结点。
558

被折叠的 条评论
为什么被折叠?



