【数据结构】4. 树与二叉树
注意: (4)递归算法和非递归算法的转换可以借助栈,将二叉树的递归遍历算法转换为非递归算法,下面以中序遍历为例给出中序遍历的非递归算法。 void In0rder2(BiTree T) { //二叉树中序遍历的非递归算法,算法需要借助一个栈 InitStack(S); //初始化栈 BiTree p = T; //p 是遍历指针 while(p || !IsEmpty(S)) { //栈不空或 p 不空时循环 if(p) { //根指针进栈,遍历左子树 Push(S,p); //每遇到非空二叉树先向左走 p = p->lchild; } else { //根指针退栈,访问根结点,遍历右子树 Pop(S,p); visit(p); //退找,访问根结点 p = p->rchild; //再向右子树走 } } } 显然非递归算法的执行效率要高于递归算法。 (5)层次遍历如图 4-7 所示为二叉树的层次遍历,即按照箭头所指方向,按照 1、2、3、4 的层次顺序,对二叉树中各个结点进行访问。 void LevelOrder(BiTree T) { InitQueue(Q); //初始化辅助队列 BiTree p; EnQueue(Q,T); //将根结点入队 while(!IsEmpty(Q)){ //队列不空循环 DeQueue (Q,p); //队头元素出队 visit(p); //访问当前 P 所指向结点 if(p->lchild != NULL) EnQueue(Q,p->lchild); //左子树不空,则左子树入队列 if(p->rchild != NULL) EnQueue(Q,p->rchild); //右子树不空,则右子树入队列 } } 对于上述二叉树层次遍历的算法,读者在复习过程当中应该将其作为一个模板,在熟练掌握其执行过程的基础上来记忆,并能够达到熟练默写的程度。
(6)由遍历序列构造二叉树由二叉树的先序序列和中序序列可以唯一地确定一棵二叉树。 同理,由二叉树的后序序列和中序序列也可以唯一地确定一棵二叉树,因为后序序列的最后一个结点就如同先序序列的第一个结点,可以将中序序列分割成两个子序列,然后采用类似的方法递归地进行划分,就可以得到一棵二叉树。 例如,求先序序列(ABCDEFGHI)和中序序列(BCAEDGHFI) 所确定的二叉树。 4.3.2 线索二叉树(1)线索二叉树的基本概念从上一节的介绍可知,遍历二叉树就是以一定的规则将二叉树中的结点排列成一个线性序列,从而得到二叉树结点的各种遍历序列。 (编辑:晋中站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |