《大话数据结构》读书笔记(二)

第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);  /* 右子树非空,则将右子树入列 */

	}
}


你可能感兴趣的:(《大话数据结构》读书笔记(二))