【问题标题】:Binary Tree Search Chech Algorithm Python Not Working二叉树搜索 Chech 算法 Python 不工作
【发布时间】:2020-07-23 11:23:47
【问题描述】:

我为 HackerRank 上的编码挑战编写了这个算法,以确定给定的二叉树是否是 BST。然而在某些情况下,当树不是 BST 时,我的算法无论如何都会返回 True。我找不到哪里出了问题,一切似乎都很好,对吧?或者我对 BST 有什么不了解的地方?

节点定义为:

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

我的算法是

def checkBST(root):
    if not root:
        return True
    else:
        if root.left and root.left.data >= root.data:
                return False
        if root.right and root.right.data <= root.data:
                return False
    return checkBST(root.left) and checkBST(root.right)

【问题讨论】:

    标签: python python-3.x algorithm binary-tree binary-search-tree


    【解决方案1】:

    二叉搜索树所有左分支上的节点小于父节点,所有右分支上的节点大于父节点。

    所以你的代码在这样的情况下失败了:

          5
         / \
        4   7
       / \
      2   6
    

    这不是一个有效的 BST,因为如果你搜索 6,你会从根开始跟随正确的分支,然后找不到它。

    【讨论】:

      【解决方案2】:

      看看下面的图片,你的代码给出了错误的答案:

      你哪里出错了:

      1.如果一个元素存在于左子树上如果存在一个值大于root的节点。

      2.如果一个元素存在于右子树上如果存在一个值小于root的节点。

      你应该试试这个方法:

      if not root:
          return True
      else:
          if root.left and maximumOfSubtree(root.left) >= root.data:
                  return False
          if root.right and minimumOfSubtree(root.right) <= root.data:
                  return False
      return checkBST(root.left) and checkBST(root.right)
      

      【讨论】:

      • 您建议的方法是树高的二次方。
      • @PaulHankin 是的,但如果作者知道他/她哪里出错了,可以优化......
      【解决方案3】:

      所以问题是确定给定的树是否是 BST。
      找出答案的最好方法是通过中序遍历。

      • 按顺序遍历给定的树并将结果存储在临时数组中。
      • 检查临时数组是否按升序排序,如果是,则树为BST。

      这可以是方法

      def check_binary_search_tree_(root):
          visited = []
          def traverse(node):     
              if node.left:   traverse(node.left)
              visited.append(node.data)
              if node.right:  traverse(node.right)
          traverse(root)
      
          fc = {}
          for i in visited:
              if i in fc:
                 return False
              else:
                  fc[i]=1
      
          m = sorted(visited)
          if visited==m:
              return True
          return False
      

      其他方法参考这里https://www.geeksforgeeks.org/a-program-to-check-if-a-binary-tree-is-bst-or-not/
      方法一和方法二和你的方法类似,所以也有助于你理解。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-12-05
        • 2010-12-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多