第6章 树(Tree)
树(Tree)是n (n>=0)个结点的有限集。 n=0时称为空树。在任意一棵非空树中:
1)有且仅有一个特定的称为根(Root)的结点;
2)当n>1时,其余结点可分为m(m>0)个互不相交的有限集T1、T2、……、Tm,其中每一个集合本身又是一棵树,并且称为根的子树(SubTree)。
二叉树(Binary Tree)是n (n>=0)个结点的有限集合,该集合或者为空集(称为空二叉树),或者由一个根结点和两棵互不相交的、分别称为根结点
的左子树和右子树的二叉树组成。
/* 二叉树的二叉链表结点结构定义 */
typedef struct BiTNode /* 结点结构 */
{
TElemType data; /* 结点数据 */
struct BiTNode *lchild, *rchild; /* 左右孩子指针 */
} BiTNode, *BiTree;二叉树的遍历(traversing binary tree)是指从根结点出发,按照某种次序依次访问二叉树中所有结点,使得每个结点被访问一次且仅被访问一次。
二叉树遍历方法包括:
1、前序遍历
/* 二叉树的前序遍历递归算法 */
void PreOrderTraverse(BiTree T)
{
if ( T==NULL )
return;
printf("%c",T->data); /* 显示结点数据,可以更改为其他对结点操作 */
PreOrderTraverse(T->lchild); /* 再先序遍历左子树 */
PreOrderTraverse(T->rchild); /* 最后先序遍历右子树 */
}2、中序遍历
/* 二叉树的中序遍历递归算法 */
void InOrderTraverse(BiTree T)
{
if ( T==NULL )
return;
InOrderTraverse(T->lchild); /* 中序遍历左子树 */
printf("%c",T->data); /* 显示结点数据,可以更改为其他对结点操作 */
InOrderTraverse(T->rchild); /* 最后中序遍历右子树 */
}3、后序遍历
/* 二叉树的后序遍历递归算法 */
void PostOrderTraverse(BiTree T)
{
if ( T==NULL )
return;
PostOrderTraverse(T->lchild); /* 先后序遍历左子树 */
PostOrderTraverse(T->rchild); /* 再后序遍历右子树 */
printf("%c",T->data); /* 显示结点数据,可以更改为其他对结点操作 */
}4、层序遍历
层序遍历书中没有附上算法,整理结果如下。
层序遍历算法中采用了队列(FIFO)方式实现,关于队列的实现这里不细说。
/* 二叉树的层序遍历递归算法 */
void LayerOrderTraverse(BiTree T)
{
if ( T==NULL )
return;
BiTree *x;
Queue Q; /* 定义队列Q */
InitQueue(&Q); /* 初始化队列Q */
EnQueue(&Q,T); /* 将根结点入列 */
while(! QueueEmpty(Q)) /* 若队列非空 */
{
DeQueue(&Q, x); /* 将队列中元素出列,并赋值给x */
printf("%c",(*x)->data); /* 显示结点数据,可以更改为其他对结点操作 */
if ((*x)->lchild)
EnQueue(&Q,(*x)->lchild); /* 左子树非空,则将左子树入列 */
if ((*x)->rchild)
EnQueue(&Q,(*x)->rchild); /* 右子树非空,则将右子树入列 */
}
}
本文详细介绍了二叉树的基本概念及四种遍历方法:前序、中序、后序和层序遍历,并提供了每种遍历方法的具体算法实现。
703

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



