二叉树的四种遍历和已知遍历序列还原二叉树(二)

版权声明:原创文章仅供大家学习使用,严禁转载 https://blog.csdn.net/qq_41809589/article/details/86563287

上一次讲了二叉树考试中常用的性质,这次说一些实际操作。
二叉树的遍历:按一定规律(顺着某一条搜索路径)访问二叉树中的所有结点,使得每个结点均被访问一次,而且仅被访问一次。访问的类型有很多,如:输出或修改结点的信息等,以下用输出为例。因为二叉树有两个或一个后继元素,所以要规定一下遍历方式。

先(根)序的遍历算法
  若二叉树为空树,则空操作;否则,
(1)访问根结点; visit(T->data);
(2)先序遍历左子树;
(3)先序遍历右子树。

代码实现:

 void pretravl(BiTree T)//先序
{
	if (T != NULL)
	{
		cout << T->date;
		pretravl(T->lchild);
		pretravl(T->rchild);
	}
}

中(根)序的遍历算法
  若二叉树为空树,则空操作;否则,
(1)中序遍历左子树;
(2)访问根结点;
(3)中序遍历右子树。

代码实现:

void medtravl(BiTree T)//中序
{
	if (T != NULL)
	{
		medtravl(T->lchild);
		cout << T->date;
		medtravl(T->rchild);
	}
}

后(根)序的遍历算法
  若二叉树为空树,则空操作;否则,
(1)后序遍历左子树;
(2)后序遍历右子树;
(3)访问根节点。

代码实现:

void behtravl(BiTree T)//后序
{
	if (T != NULL)
	{
		behtravl(T->lchild);
		behtravl(T->rchild);
		cout << T->date;
	}
}

3种遍历算法不同之处仅在于访问根结点、遍历左子树、遍历右子树的先后关系。若不考虑visit()语句,则三种遍历方法完全相同(访问路径是相同的,只是访问结点的时机不同) 。三种遍历算法均是递归算法:二叉树的定义本身就是递归的;递归和栈密切联系:递归过程实际就是对栈的操作过程,可以直接通过对栈的操作,来把递归算法写为非递归算法

【二叉树的非递归形式遍历】(以中序为例)

中序遍历的非递归算法思路
1.初始化一个空栈,指针P从二叉树的根结点开始。
2.如果p不空或栈不空,循环执行以下操作。
  1) 如果p不空,表示到达了一个结点,将结点p入桟,并进入其左子树。
  2) 如果p为空而栈不空,表明已经沿着某条路径走出了二叉树,此时需返回访问这条路径最后经过的结点,而该结点正好被保存在栈的栈顶,因此弹出栈顶元素并让p指向它,接下来访问结点p,然后进入其右子树。
3.算法结束
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
代码实现:

Status InOrderTraverse( BiTree T, status (*visit)(TElemType e ))
{	
    InitStack( S );
    p = T;
    while( p || !StackEmpty( S ))
    { 
        if( p )// 根指针进栈,遍历左子树
	    {   
		     Push( S, p );
		     p = p->lchild;		
		}
		else // 根指针出栈,访问根结点,遍历右子树
		{    
		     Pop( S, p );
		     if( !(*Visit)( p->data))  return ERROR;
		     p = p->rchild;	// 右子树
		}// else
	 }// while
	 return OK;
  }// InOrderTraverse

二叉树的所有算法都是建立在遍历的基础上的,故二叉树的应用也是以遍历为基础,或者说以遍历为主框架。在应用遍历算法时,不同的问题需要对其中的“访问结点”操作作适当的修改。二叉树的创建和求高度及叶子数在我之前的博客中提到过,在这儿就不说了。

【已知两种遍历序列还原二叉树】
在借助两种已知遍历序列还原二叉树中,必须有一种是中序遍历,因为先序和后序都是确定纵向关系,只有中序是确定横向关系。下面根据例题来讲解一下怎么还原。
例题一:已知先序和中序还原二叉树及求后序遍历序列
在这里插入图片描述
例题二:已知中序和后序还原二叉树及求先序遍历序列
在这里插入图片描述
总结一下:上面两道例题都是先根据先序或后序来确定根节点,在中序中由根节点再划分为两个子树,再通过先序或后序判断出子树的根节点,再在中序中划分为若干个子树,从此来递归地一步一步还原二叉树。
已知一种遍历方法和以这种方法遍历的序列,空节点用特殊符号表示,这种题一般为中序遍历,用这种方法可以直接建立一个二叉树,就是所求的二叉树,在前面博客二叉树的创建的章节中提到过,较为简单,就不赘述了。

猜你喜欢

转载自blog.csdn.net/qq_41809589/article/details/86563287
今日推荐