使用递归将二进制搜索树转换为双向链表

时间:2012-09-06 08:44:53

标签: c algorithm list binary-search-tree

正如标题中所提到的,我有一个二进制搜索树。我想使用递归将其转换为已排序的双链表。

我的代码

 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)

是每个递归调用中的链接节点。

3 个答案:

答案 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。