为了BST遍历:找到(In order BST traversal: find)

2019-10-19 06:30发布

我试图找到二叉搜索树的第k个最小元素,我必须使用递归问题。 我明白如何打印树序/后序等,但我无法返回元素的等级。 在哪里可以我犯了一个错误的人呢? 在一般情况下,我有很难在树上理解递归。

编辑:这是一个锻炼,所以我不是在寻找使用内置的功能。 我还有一个解决方案,我把左,右子女数的轨道,因为我插入节点和代码是工作的罚款。 我想知道是否有可能使用这个,因为它似乎是一个简单的解决方案做序遍历。

class BinaryTreeNode:
    def __init__(self, data, left=None, right=None):
        self.data = data
        self.left = left
        self.right = right


def traverseInOrder(root,order):

    if root == None:

        return
    traverseInOrder(root.left,order+1)
    print root.data,
    print order

    traverseInOrder(root.right,order)


"""
             a
           /   \
          b     c
        /  \   /  \
       d    e f    g
     /  \
    h    i
"""
h = BinaryTreeNode("h")
i = BinaryTreeNode("i")
d = BinaryTreeNode("d", h, i)
e = BinaryTreeNode("e")
f = BinaryTreeNode("f")
g = BinaryTreeNode("g")
b = BinaryTreeNode("b", d, e)
c = BinaryTreeNode("c", f, g)
a = BinaryTreeNode("a", b, c)

print traverseInOrder(a,0)

Answer 1:

如果这是一个学术活动,使traverseInOrder(或量身定做的目的类似的方法)返回其参观的儿童人数。 从那里,事情就变得简单了。

如果这不是学术,看看http://stromberg.dnsalias.org/~dstromberg/datastructures/ -类似于字典的对象是所有的树木,并支持迭代器-所以找到第n是拉链的问题(树,范围(N))。



Answer 2:

你可以先找到在二叉搜索树的smallets元素。 然后,从该元素调用一个方法给你的下一个元素k次。

对于find_smallest_node方法,注意,您可以穿越“有序”的所有节点,直到达到最小。 但这种方法需要O(n)的时间。

但是,你并不需要一个递归来找到最小的节点,因为在BST最小的节点仅仅是最左边的节点,这样你就可以遍历节点,直到发现没有左子节点,它需要O(log n)的时间:

class BST(object):

  def find_smallest_node(self):
    if self.root == None:
      return
    walking_node = self.root
    smallest_node = self.root
    while walking_node != None:
      if walking_node.data <= smallest_node.data:
        smallest_node = walking_node
      if walking_node.left != None:
        walking_node = walking_node.left
      elif walking_node.left == None:
        walking_node = None
    return smallest_node


  def find_k_smallest(self, k):
    k_smallest_node = self.find_smallest_node()
    if k_smallest_node == None:
      return 
    else:
      k_smallest_data = k_smallest_node.data
    count = 1
    while count < k:
      k_smallest_data = self.get_next(k_smallest_data)
      count += 1
    return k_smallest_data


  def get_next (self, key):
   ... 

它只是需要将它们插入到树时保持节点的父节点。

class Node(object):
  def __init__(self, data, left=None, right=None, parent=None):
    self.data = data
    self.right = right
    self.left = left
    self.parent = parent

与上述方法,也是BST类的实现def get_next (self, key)的功能是在这里 。 上层文件夹包含测试用例它和它的工作。



文章来源: In order BST traversal: find