正如标题中所提到的,我有一个二进制搜索树。我想使用递归将其转换为已排序的双链表。
我的代码
for each node in tree
find max of left sub-tree and assign its right to present node ,present node left to max
find min of right sub-tree and assign its left to present node ,present node right to max
and now recursively do same thing to other nodes in BST .
但是这个解决方案效率不高,因为它不止一次到达每个节点。在我对优化代码的追求中,我得到了谷歌greatTreeList sollution的链接。我在SO搜索了同样的内容,两个解决方案都是一样的,并为我工作。我不理解sollution的append function
,因为它包含代码
join(alast,b)
join(blast,a)
对于节点按以下顺序插入的树10,5,9,6,8,7,12,11,13,14
任何人都可以解释如何 加入(alast,B) 加入(爆炸,a)
是每个递归调用中的链接节点。
答案 0 :(得分:1)
为了将二进制搜索树转换为已排序的双向链表,通常会执行深度优先遍历的遍历,沿着遍历构建列表。
尝试提供执行深度优先遍历的代码,并按排序顺序打印二叉树的项目。从那里,应该很容易完成你的任务。
答案 1 :(得分:1)
我认为你认为这实际上非常简单 - 从二叉树中按顺序提取数据就像进行深度优先遍历一样简单 - 这是二元树的一个点,它非常有效地为你提供元素按排序顺序。
所以你需要做的是树的标准深度第一步,每次你找到一个节点将它添加到你的链表。
这个顺序深度第一次递归是相当直接的伪代码:
Traverse(Node N)
Traverse(N.left);
Add N to the linked list
Traverse(N.right);
我建议您手动尝试这个示例,以便了解其工作原理。
答案 2 :(得分:1)
扩展元素的答案
Traverse(Node N)
Traverse(N.left);
Add N to the linked list
Traverse(N.right);
要将N添加到链接列表,
您的链接列表类或数据结构应该有append()方法或类似方法。
运用你的想象力,但是这样的事情:
def append(N):
new_tail = node(val=N, prev=self.tail, next=None)
self.tail.next = new_tail
self.tail = new_tail
当然你还需要在第一次追加时添加self.head = self.tail。