用于在二叉搜索树中查找小于给定值的所有值的算法

时间:2013-02-03 20:13:09

标签: algorithm binary-search-tree inorder

  

使用int的二进制搜索树创建一个小于给定整数 x 值的所有整数的链接列表。

我尝试了什么?

1)残酷的解决方案(效率低下)

对BST进行inorder次访问,我在列表中为Bst中的每个整数插入一个节点, 然后我从x

开始释放列表中的每个节点

2)效率更高但错误

我进行搜索,当我找到x时,我创建了一个列表,其中包含了我找到x的节点左子的有序访问。

这显然是错误的,例如考虑以下BST:

                         10
                        /  \
                       9    11
                      /       \
                     5         15
                    / \        / \
                   1   8      13  19
                             /  \
                            12  14

使用此解决方案,如果x = 15,我只考虑{12,13,14},它只适用于x = root。

问题是我该怎么做?

3 个答案:

答案 0 :(得分:1)

伪代码。 v 是当前顶点, ans 是答案列表, someTraversal 是遍历树并返回其元素列表的方法。

  1. v:= root,ans:= []
  2. 如果 v.value> x
    然后 v:= v.left,转到 2;
  3. ans.append(someTraversal(v.left))
  4. 如果 v.value = x
    然后返回 ans;
  5. ans.append(v.value)
  6. v:= v.right;
  7. 转到 2;

答案 1 :(得分:1)

如果存储每个节点的父节点,只要您不关心结果列表中元素的顺序,就可以实现更有效的解决方案:

  1. 创建新列表以保存结果
  2. 找到感兴趣的节点
  3. 使用您想要的任何遍历(按顺序,预订等)将步骤2中找到的节点的左子树中的所有节点添加到列表中
  4. 从步骤2中找到的节点的父节点开始,通过所有父节点向上添加每个节点,直到当前节点是根节点或其父节点左侧的节点
  5. 最后,将所有元素添加到步骤4中找到的节点的左侧,再次使用任何遍历

答案 2 :(得分:0)

这是一个inorder遍历的修改版本,当节点的值为>时终止。 X

def nums_less_than(n, x, l=None):
  if l == None:
    l = []
  if n.left:
    nums_less_than(n.left, x, l)
  if n.value < x:
    l.append(n.value)
    if n.right:
      nums_less_than(n.right, x, l)
  return l