第六章 树 二叉树.doc

  1. 1、本文档共13页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间: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总是指向当前访问的结点。 voldINTHREAD(TBTREET) { TBTREE pre; if(T!=Null){ INTHREAD(T—lchild); if(T—rchild==NULL) T—rbit=0; 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是二叉树中所有外部结点的路径长度之和,即 EPL=2X2+3X1+4X4+5X3十6X2=50 习 题 7.1 判断题(在你认为正确的题后的括号中打√,否则打X)。 (1)在树型结构中,每一个结点最多只有一个前驱结点,但可以有多个后继结点。 ( ) (2)在树型结构中,每—个

文档评论(0)

hshh + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档