Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 在二叉搜索树中查找小于给定值的所有值的算法_Algorithm_Binary Search Tree_Inorder - Fatal编程技术网

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

Algorithm 在二叉搜索树中查找小于给定值的所有值的算法,algorithm,binary-search-tree,inorder,Algorithm,Binary Search Tree,Inorder,使用整数二叉搜索树创建一个链表,其中包含小于给定整数x值的所有整数 我试过什么 1)残酷的解决方案(效率低下) 访问BST时,我在列表中为BST中的每个整数插入一个节点, 然后我从x开始释放列表中的每个节点 2)效率更高但错误 我进行搜索,当我找到x时,我创建一个列表,其中包含我找到x的节点的左子节点的顺序访问 这显然是错误的,例如考虑到以下BST: 10 / \

使用整数二叉搜索树创建一个链表,其中包含小于给定整数x值的所有整数

我试过什么

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

访问BST时,我在列表中为BST中的每个整数插入一个节点, 然后我从x开始释放列表中的每个节点

2)效率更高但错误

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

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

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

这个解如果x=15,我只考虑{12,13,14},它只适用于x=根。

问题是我怎么做?

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

  • v:=根,ans:=[]
  • ifv.value>x
    然后v:=v.left,goto2
  • ans.append(someTraversal(v.left))
  • 如果v.value=x
    然后返回ans
  • ans.append(v.value)
  • v:=v右
  • goto2
    如果存储每个节点的父节点,则可以实现更高效的解决方案,只要不关心结果列表中元素的顺序:

  • 创建新列表以保存结果
  • 找到感兴趣的节点
  • 使用您喜欢的任何遍历(按顺序、预顺序等),将步骤2中节点左子树中的所有节点添加到列表中
  • 从第2步中找到的节点的父节点开始,遍历所有父节点,以这种方式添加每个节点,直到当前节点是根节点或其父节点左侧的节点
  • 最后,再次使用任何遍历将所有元素添加到步骤4中找到的节点左侧

  • 这里是一个修改版本的顺序遍历,当节点的值大于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
    
    def nums_小于(n,x,l=None):
    如果l==无:
    l=[]
    如果n.左:
    nums_小于(n.左,x,l)
    如果n.值
    我不明白。为什么还要在1中的列表中插入大于x的数字?因此,当我遇到x时,我必须返回?为什么不修改顺序遍历,以便在当前节点=x时不遍历正确的子树?(从根目录中按顺序修改Ofc调用)当遇到x或大于x的数字时,是的。