18
|
Merlyn Morgan-Graham · 技术社区 · 14 年前 |
![]() |
1
22
想法:可以沿着树的左子级构建链接列表。同时,该列表的右子级用于保存要在尾部插入的下一个子树的队列。 伪码算法:( 编辑:为了清晰起见而重写 )
插图开始树(我认为它应该是一个完整的树;如果缺少节点,它们应该从最后开始。你可以试着给其他情况赋予意义,但有几种不同的可能性,而且这涉及到很多麻烦):
请注意,这些值不一定是节点的值,它们只是为了显示而编号。
一次迭代后的树(注意列表的形成
经过3次迭代(列表现在
经过8次迭代(几乎完成):
实码(Lisp)这是节点类:
一个有用的助手:
转换函数( 编辑:为了清晰起见而重写 ):
锯齿状树木的不可逆操作:我已经重写了上面的内容,以允许任意的参差不齐的树木。但是,您不能再从此处重建原始树。
这里的内环
;;这个内部循环是 o(n) 队列插入
;;最后,返回原始根。
|
![]() |
2
5
就记录而言,递归版本很漂亮(这是C): [编辑:正如st0le指出的,我的第一个版本包含“新的”!原谅我,过去20年我一直用声明性语言编写代码。这是正确的版本。] [编辑:两只老鼠。这不是宽度优先。]
|
![]() |
3
2
首先,我假设您的节点有一个指向其父节点的“父”字段。或者您需要一个堆栈才能在树中向后移动(因此无法实现O(1)辅助内存需求)。 在O(1)空间中有一个众所周知的有序迭代。例如,假设您希望按顺序打印项目。基本上,当您遍历一个二叉树时,您必须在任何给定的时刻,在任何给定的节点中,决定是否要向上(向父节点)、向左(向左子节点)或向右移动。这个算法的想法是基于你来自哪里:
好的:所以这是你拿它作为基础的算法。现在,很明显,如果您正在将其破坏性地修改为一个链接列表,那么您应该只在不再访问节点时修改它。那是你从右边上来的时候。此时,您必须决定该节点的后续节点将是什么…? 嗯,您需要随时跟踪两个指针:一个指向您访问过的最小节点,另一个指向您在当前根子树中访问过的最大节点。当您从正确的子节点访问时,您使用最小的节点作为上一次访问的节点的后续节点,并使用最大的节点作为上一次访问从其他位置访问的节点的后续节点,因为它们恰好没有正确的子节点! 编辑1 :我忘了说,我隐式地认为二进制树中的“parent”字段成为链接列表中的“next”字段——这是我在最后一步中修改的内容。 编辑3 :我的答案的以下部分并没有完全回答最初的问题(但前面的内容仍然相关)。 编辑2 :遵循Svante的可理解的愿望,我明确了将左旋转用于某些代码的建议:
旋转函数并不优雅,但由于很容易混淆,我尝试使用与中使用的完全相同的命名。 Wikipedia's article on rotations . 在我的代码中,节点a、b、c是这样命名的;节点p和q不是,因为我选择不使用指针指针,所以我使用了转换p和q值的技巧--in 代替 转换位置。使用“旋转权”,转换算法非常简单:
结果树是经过排序的链接列表,其中 下一个 列表指针以前是 正确的 树中的指针。最后,这里是一个测试程序:
|
![]() |
4
1
好吧,我现在还不太清楚这在这种情况下有什么帮助,但它可能会给你一个线索。有一种称为“指针反转”的技术用于迭代遍历树,而无需使用堆栈/队列来存储指针——它主要用于低内存开销的垃圾收集器。其背后的想法是,当您遍历到节点的子节点时,您将指向该子节点的指针链接回父节点,这样,当您完成该节点时,您就知道返回到何处。这样,通常保存在堆栈/队列中的回溯信息现在嵌入到树本身中。 我发现了以下内容 slideshow 举个例子(不幸的是,谷歌没有更好的东西)。这里的例子展示了如何在没有额外存储的情况下遍历二叉树。 |
![]() |
5
0
我认为我们不需要父母指点。假设0到k-1级加上一个sentinel节点被转换为左子指针上的单个链接列表,右子指针指向k级的节点。遍历该列表,依次抓取每个“右子”(k级节点)并将其插入到列表末尾,覆盖右指针,从中它很快就被改写了,留下了孩子。当我们到达列表的初始末尾时,我们将归纳假设扩展到k+1。 编辑:代码
|
![]() |
6
0
这是我的答案。我现在意识到这和斯万特的解决方案是一样的方法。尽管我把树建在右边。 关于记录,这里是C代码:
|
![]() |
7
0
关于这个解决方案
|
![]() |
8
0
有一个简单的Java实现与所描述的第一种方法。 |
![]() |
9
0
这是我对这个问题的看法;
|
|
bb ef · 如何使用递归从列表中删除某些内容?python 6 年前 |
![]() |
Adam Morad · 方案更改树值 6 年前 |
![]() |
johnny 5 · 角度将ViewChild绑定到类中的属性 6 年前 |
![]() |
user2467011 · 为什么给定的二叉树是用空节点构造的? 6 年前 |