后序遍历的非递归算法.doc

合集下载
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

第六章树二叉树

后序遍历的非递归算法。在对二叉树进行后序遍历的过程中,当指针p 指向某一个结点时,不能马上对它进行访问,而要先遍历它的左子树,因而要将此结点的地址进栈保存。当其左子树遍历完毕之后,再次搜索到该结点时(该结点的地址通过退栈得到) ,还不能对它进行访问,还需要遍历它的右子树,所以,再一次将此结点的地址进栈保存。为了区别同一结点的两次进栈,引入一个标志变量nae,有0 表示该结点暂不访问 1 表示该结点可以访问标志flag 的值随同进栈结点的地址一起进栈和出栈。因此,算法中设置两个空间足够的堆栈,其中, STACKlCM] 存放进栈结点的地址, STACK2[M] 存放相应的标志n 昭的值, 两个堆栈使用同一栈顶指针top , top 的初值为— 1 。

具体算法如下:

#defineH 100 /•定义二叉树中结点最大数目。/

voidPOSTOiRDER(BTREET)

{

/ *T 为二叉树根结点所在链结点的地址。/

BTREESTACKl[H] , p=T ;intSTACK2[M] , flag,top= —1;if(T!=NULL)

d0{

while(p!=NULL){

STACK/[++top]=p ; /•当前p所指结点的地址进栈•/

STACK2[top]= 0 ; /,标志0 进栈•/

p=p->lchild ;/•将p 移到其左孩子结点x/

}

p=STACKl[top) ;flag=STACK2[top--] ;if(flag==0){ STACKl[++top]=p ; /,当前p所指结点的地址进栈。/

STACK2[toP]=1 ; /•标志1 进栈•/

p=p->rchild ; /x将p移到其右孩子结点o/

}

else{

VISIT(p) ; /x访问当前p所指的结点x/

p=NULL ;

}

}while(p!=NULLtttop!=-1) ;

} 不难分析,上述算法的时间复杂度同样为O(n)

7.6.3 二叉树的线索化算法

对--X 树的线索化,就是把二叉树的二叉链表存储结构中结点的所有空指针域改造成指向某结点在某种遍历序列中的直接前驱或直接后继的过程, 因此, 二叉树的线索化过程只能

在对二叉树的遍历过程中进行。

下面给出二叉树的中序线索化的递归算法。算法中设有指针pre,用来指向中序遍历过

程中当前访问的结点的直接前驱结点,pre的初值为头结点的指针;T初始时指向头结点,

但在算法执行过程中,T总是指向当前访问的结点。voldlNTHREAD(TBTREET) { TBTREE pre ;

if(T!=Null){

INTHREAD(T —>lchild);

if(T —>rchild==NULL)

T—>rbit=O ;

if(T —>lchild==NUll);

T—>lchild=pre ;

T—>lbit=0 ;

}

if(pre —>rbitc==0)

pre—>rchild=T ;

pre=T ;

inthread(T->rchild);

} }

平均查找长度(AverageSearchLength):确定一个元素在树中的位置所需要进行的比较次数的期望值。

二叉树的内路径长度(InternalPathLength):从二叉树根结点到某结点所经过的分支数目定义为该结点的路径长度。

二叉树中所有结点的路径长度之和定义为该二叉树的内路径长度IPL。图7。25(h)给出的二叉排序树的内路径长度为

IPL : 1X2+2X2+3X1+4X2=17

二叉树的外路径长度(ExternalPathLength):为了分析查找失败时的查找长度,在二叉树

中出现空子树时,增加新的空叶结点来代表这些空子树,从而得到一棵扩充后的二叉树。为了与扩充前的二叉树相区别,这些新增添的空的叶结点用小方块代表,称之为外部结点,树中原有的结点为内部结点。

图7. 27给出了一棵扩充后的二叉树,其外路径长度EPL是二叉树中所有外部结点的

路径长度之和,即

习题

7.1判断题(在你认为正确的题后的括号中打",否则打X)。

(1) 在树型结构中,每一个结点最多只有一个前驱结点,但可以有多个后继结点。( )

(2) 在树型结构中,每—个结点不能没有前驱结点。( )

(3) 在度为k 的树中,至少有一个度为k 的结点。( )

(4) 在度为k 的树中,每个结点最多有k—1 个兄弟结点。( )

(5) 度为2 的树是二叉树。( )

(6) 二叉树的度一定为2。( )

(7) 在非空完全二叉树中,只有最下面一层的结点为叶结点。( )

(8) 在完全-y .树中,没有左孩子的结点一定是叶结点。()

(9) 在完全二叉树中,没有右孩子的结点一定是叶结点。( )

(10) 在结点数目一定的前提下,各种形态的二叉树中,完全二叉树具有最小深度。( )

(11) 满二叉树一定是完全二叉树。( )

(12) 满二叉树中的每个结点的度不是0 就是2。( )

(13) 在所有深度相同的二叉树中,满二叉树具有最大结点数目。( )

(14) 具有n 个结点的非空二叉树一定有n—1 个分支。( )

(15) n 个结点的二叉树采用二叉链表结构,链表中有n—1 个存放NULL 的指针域。( )

(16) “退化二叉树”不宜采用顺序存储结构的主要原因是空间浪费较大。( )

(17) 由二叉树的前序序列和中序序列可以惟一地确定一棵二叉树。( )

(18) 由二叉树的中序序列和后序序列可以惟一地确定一棵二叉树。( )

(19) 由二叉树的前序序列和后序序列可以惟一地确定一棵二叉树。( )

(20) 实现二叉树的按层次遍历算法时需要用到队列结构。( )

(21) 实现二叉树的遍历算法时不需要用到堆栈结构。( )

(22) 线索二叉树对应的二叉链表中不存在空的指针域。( )

(23) 二叉排序树中的任何一棵子树也是二叉排序树。( )

(24) 一个序列对应的二叉排序树是惟一的。( )

(25) 按照“逐点插入法”建立的二叉排序树的深度与结点的插入顺序无关。( )

(26) 在二叉排序树中进行查找的效率与二叉排序树的深度有关。( )

(27) 在二叉排序树中查找一个结点,查找长度不会超过二叉树的深度。( )

(28) 给定一组权值,构造出来的哈夫曼树是惟一的。( )

(29) 哈夫曼树中不存在度为 1 的结点。( )

(30) 在哈夫曼树中,权值相同的叶结点都在同一层上。( )

7. 2 单项选择题。

(1) 树型结构最适合用来描述——。

A •有序的数据元素B•无序的数据元素

C.数据元素之间具有层次关系的数据 D .数据元素之间没有关系的数据

(2) 对于一棵具有n 个结点、度为4的树而言,——。

A .树的深度最多是n-4

B .树的深度最多是n-3

C.第i层上最多有4x(i-1)个结点

D.最少在某一层上正好有4个结点

(3) “二叉树为空”意味着二叉树————。

A •由一些未赋值的空结点组成B.根结点无子树

巳不存在D.没有结点

(4) 按照二叉树的定义,具有3个结点的二叉树有——种形态(不考虑数据信息的组合情况)。

A. 2

B. 3

C. 4

D. 5

(5) 若一棵度为7 的树有8 个度为1 的结点,有7 个度为2 的结点,有6 个度为3 的结点,有5个度为4的结点,有4 个度为5的结点,有3个度为6的结点,有 2 个度为7的结点,则该树一共有——个叶结点。

A .35 B.28 C.77 D.78

(6) 若一棵二叉树有10 个度为2 的结点,则该二叉树的叶结点的个数是——。

相关文档
最新文档