采用路径模型实现遍历二叉树的方法

  • 时间:
  • 浏览:4
  • 来源:uu快3新平台_uu快3诀窍_讨论群

    为了完成里边的辦法 ,首不难 知道行人所在位置相对于节点的方位,却说 按照如下辦法 定义树节点的序点,即针对二叉树的某个节点,从12点方向逆时针环绕该节点一周,在什儿 圆周型路径上将依次经过一共 7 个关键节点,如下图所示:

    在环绕节点转动时,却说 并能知道本人相对于节点位于的方位,就还需要根据什儿 方位信息知道在当前遍历序下,有无应访问该节点。

    原来给出有另另一个多 二叉树的形态图,亲们就还需要在草稿纸上很容易的给出并有无序遍历的结果。现在亲们将采用代码实现里边的辦法 ,根据上图模型,给出节点的定义,它将有有另另一个多 中有 7 个元素的指针数组来描述路径里边的关键节点,把图中红色的点(索引为 1,3, 5)称之为序点,它们固定为 NULL,即当路径经过哪些地方地方特殊点时,是访问该节点的时机(每个序点对应特定的遍历序,已标注于图中)。一些元素属于指向一些节点的连线方向(哪些地方地方节点是指向一些节点的实际指针),相似左右子结点,父节点等。很显然,节点的 lParent 和 rParent 至多不还还都能有无另另一个多 不为 NULL,却说 两者都为 NULL,它是二叉树的根节点。

    该路径从根节点进入,饶树环绕一周,从根节点退出完成。当路径穿过节点的序点时,输出/访问该节点。如下图说是:左侧是范例二叉树(该范例来自《系统设计师(高级任务管理器员)教程》P428页,王春森主编),右侧则给出了虚拟路径。

    却说 树的递归性,统统 哪些地方地方遍历采用递归函数实现非常直观简便。但对于有另另一个多 给定的二叉树,要求手工计算出各种序遍历结果时,却说 递归函数从计算机实现下行速率 易于理解,而从手工演算来说暂且适合,统统 我采用了并有无虚拟路径穿过序点的辦法 来实现手工给出有另另一个多 二叉树的遍历结果。

    代码实际上统统 我模拟了沿着虚拟路径进行行进,当经过指向一些节点的指针时,进入一些节点(饶着树的形态主干行进),当经过序点时,访问该节点即可。范例代码如下:

    注意,当从某个子节点沿着指针回到其父节点时, 亲们需要明确知道本人位于的方位。统统 就需要知道子结点指向父节点的连线的方向。却说 ,里边的定义中,需要需要给出父节点位于自身的哪个方向(左侧还是右侧),即需要定义左父/右父指针,这是和普通的树不同的所在。普通的树的父节点仅仅体现在子结点“里边”,是没人相对于子结点的方向信息的!

    多年前,小玉学妹(littlehead)曾向我请教用栈去改写树的遍历问題,在当时却说 我没人学习过相关知识,统统 给出的本人的想法却说 是不切实际的(但我已记不清当初给的是哪些地方想法,离米 是在树节点上增加标识一类的),也没人给出实现。很遗憾当初我的能力和知识的有限实际上我未能给出哪些地方帮助。多年后我偶然半三更三更半夜出显什儿 点子却说 把我的辦法 用代码实现了。本文所述的辦法 也是通过在树节点上增加信息量来实现的,从空间使用上来说实际上统统 我把请况由辅助栈转移到了节点数据上而已,却说 它是并有无可选辦法 ,但不属于改进辦法 。以此文献给小玉(littlehead)学妹。

    王春森,系统设计师(高级任务管理器员)教程,清华大学出版社。

     针对里边的范例二叉树,假设有有另另一个多 行人,用右侧的路径绕着树行进时,并始终尝试向逆时针方向转动,游历节点的顺序如下:

    优点是,组建树时,额外描述了节点的父节点以及该父节点相对于它的方向性,原来亲们就还需要实现有另另一个多 相对简单的形式单一的遍历函数(Travel),完成二叉树的所有并有无辦法 遍历,仅需要在参数中指定序点即可。该遍历函数全是 递归函数(却说 不像递归函数那样会在栈上堆叠较多的 stack frame),代码简单易读,对树的遍历就好像在遍历有另另一个多 线性链表一样。

    1 -> 2-> 4-> 7 -> 4 -> 2 -> 5 -> 2 -> 1 -> 3 - > 6 - > 8 -> 6 -> 9 -> 6 -> 3 - > 1;

    【补充后记】

    

    参考资料:

    

    总结:

    缺点是,而该辦法 每个节点将中有 7 个指针(比普通的二叉树描述占用内存要高),却说 一半以上是 NULL 指针,却说 树节点没人来越多,内存方面将需要权衡和优化。对于树什儿 形态,却说 删剪树的内存需求关于树下行速率 的增长下行速率 飞快,统统 却说 树规模较大,全是 慎重考虑内存需求的限制。换句话说,应当仅尝试在内存中建立较小规模的树。

    范例代码中,构建了图 1 中的范例二叉树,并分别用前序,中序,后序进行了遍历。Visit为访问节点函数,目前它仅仅是把节点的值进行打印输出。该任务管理器产生的输出如下:

    问題描述:对树的遍历有,前序遍历,后序遍历。(注意,这里前后序的定义是指节点并有无和它的子结点之间的访问顺序关系,而全是 某个节点的子结点之间的访问顺序关系,即这里的序指的是父子关系,而非子间关系)。对二叉树又有中序遍历(很重的,对二叉查找树的中序遍历,是有另另一个多 有序序列)。