数据结构——二叉树遍历原理及方法

数据结构——二叉树遍历原理及方法

二叉树的遍历(traversing binary tree)是指从根结点出发,按照某种次序依次访问二叉树中所有结点,使得每个结点被访问一次且仅被访问一次。

创建二叉树

如果我们要在内存中建立一个如图6-9-1左图这样的树,为了能让每个结点确认是否有左右孩子,我们对它进行了扩展,变成图6-9-1右图的样子,也就是将二叉树中每个结点的空指针引出一个虚结点,其值为一特定值,比如“#”。我们称这种处理后的二叉树为原二叉树的扩展二叉树。扩展二叉树就可以做到一个遍历序列确定一棵二叉树了。比如图6-9-1的前序遍历序列就为AB#D##C##。
数据结构——二叉树遍历原理及方法_第1张图片
有了这样的准备,我们就可以来看看如何生成一棵二叉树了。假设二叉树的结点均为一个字符,我们把刚才前序遍历序列AB#D##C##用键盘挨个输入。实现的算法如下:

typedef int TElemType;/*树结点的数据类型*/
typedef struct  BiTNode /*结点结构*/
{
	TElemType data;    /*结点数据*/
	struct BiTNode* lchild, * rchild; /*左右孩子指针*/
} BiTNode, * BiTree;

/*按前序输入二叉树中结点的值(一个字符)*/
/*# 表示空树,构造二叉链表表示二叉树T*/
void CreateBiTree(BiTree *T)
{
	TElemType ch;
	scanf("%c", &ch);
	if (ch=='#')
	{
		*T = NULL;
	}
	else
	{
		*T = (BiTree)malloc(sizeof(BiTree));
		if (!*T)
		{
			exit(OVERFLOW);
		}
		(*T)->data = ch;/*生成根结点*/
		CreateBiTree(&(*T)->lchild);
		CreateBiTree(&(*T)->rchild);
	}
}

二叉树遍历方法

二叉树的遍历方式可以很多,如果我们限制了从左到右的习惯方式,那么主要就分为四种:

1.前序遍历
规则是若二叉树为空,则空操作返回,否则先访问根结点,然后前序遍历左子树,再前序遍历右子树。如图6-8-2所示,遍历的顺序为:ABDGHCEIF。
数据结构——二叉树遍历原理及方法_第2张图片

void PreOrderTraverse(BiTree T)
{
	if (T == NULL)
	{
		return;
	}
	printf("%c",T->data);/*显示结点数据,可以更改为其他对结点操作*/
	PreOrderTraverse(T->lchild);/*再先序遍历左子树*/
	PreOrderTraverse(T->rchild);/*最后先序遍历右子树*/
}

2.中序遍历
规则是若树为空,则空操作返回,否则从根结点开始(注意并不是先访问根结点),中序遍历根结点的左子树,然后是访问根结点,最后中序遍历右子树。如图6-8-3所示,遍历的顺序为: GDHBAEICF。
在这里插入图片描述
数据结构——二叉树遍历原理及方法_第3张图片

void PreOrderTraverse(BiTree T)
{
	if (T == NULL)
	{
		return;
	}

	PreOrderTraverse(T->lchild);/*再中序遍历左子树*/
	printf("%c", T->data);/*显示结点数据,可以更改为其他对结点操作*/
	PreOrderTraverse(T->rchild);/*最后中序遍历右子树*/
}

3.后序遍历
规则是若树为空,则空操作返回,否则从左到右先叶子后结点的方式遍历访问左右子树,最后是访问根结点.如图6-8-4所示;遍历的顺序为:GHDBIEFCA.
数据结构——二叉树遍历原理及方法_第4张图片

void PreOrderTraverse(BiTree T)
{
	if (T == NULL)
	{
		return;
	}

	PreOrderTraverse(T->lchild);/*再后序遍历左子树*/
	PreOrderTraverse(T->rchild);/*再后序遍历右子树*/
	printf("%c", T->data);/*显示结点数据,可以更改为其他对结点操作*/

}

你可能感兴趣的:(数据结构,数据结构,二叉树)