【问题标题】:How to find if a value exist within a Binary Tree: True or False (Python3)如何查找二叉树中是否存在值:对或错(Python3)
【发布时间】:2020-10-09 07:06:10
【问题描述】:

我正在尝试编写一个代码,如果该值存在于二叉树中,则输出返回 True 或 False。

这是我的尝试:

定义一个名为 Node 的类:

class Node:

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

定义一个名为 BinaryTree + LOOKUP 函数的类:

class BinaryTree:
    def __init__(self, rootdata):
    self.root = Node(rootdata)

    def LOOKUP(self, lookupval):
        if lookupval < self.data:
            if (self.left == None):
                self.left.LOOKUP(lookupval)
                return False
        elif lookupval > self.data:
            if (self.right == None):
                self.right.LOOKUP(lookupval)
                return False
        else:
            return True

剩下的,将值输入二叉树:

Tree = BinaryTree(24)
Tree.root.left = Node(11)
Tree.root.left.left = Node(199)
Tree.root.left.right = Node(167)
Tree.root.right = Node(2)
Tree.root.right.right = Node(8)

print(Tree.LOOKUP(11))
print(Tree.LOOKUP(13))

但是,我不断收到错误 'BinaryTree' object has no attribute 'data'..

我明白LOOKUP函数的定义会有一些错误, 但有没有机会我可以保持这种格式并仍然返回输出:

True
False

谢谢,

【问题讨论】:

  • 你应该像Tree.LOOKUP(11, Tree.root)一样打电话给LOOKUP。然后递归使用self.node.data/left/right
  • 该树应该是二叉搜索树,还是只是任意二叉树,没有任何特定顺序?因为您的 LOOKUP 方法的逻辑(在可以围绕其问题提取的范围内)似乎是用于搜索树,如果它要正常运行,则需要按顺序排列。而且您肯定不是在构建有序树。

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


【解决方案1】:

您的代码中的问题是:

  • 您尝试引用 self.right(应该改为 self.root.right - 因为我们不在 Node 实例上)
  • 嵌套的 if 检查错误。如果 NOT None 或在此处返回 False,则应递归检查左/右树。

做这样的事情:

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

class BinaryTree:
    def __init__(self, rootdata):
        self.root = Node(rootdata)

    def LOOKUP(self, lookupval):
        
        if lookupval < self.root.data:
            if self.root.left: 
                return BinaryTree(self.root.left.data).LOOKUP(lookupval) # recursively check the left tree
            else:
                return False # can't go any further- so return false
        elif lookupval > self.root.data:
            if self.root.right:
                return BinaryTree(self.root.right.data).LOOKUP(lookupval)
            else:
                return False
        else:
            return True

Tree = BinaryTree(24)
Tree.root.left = Node(11)
Tree.root.left.left = Node(199)
Tree.root.left.right = Node(167)
Tree.root.right = Node(2)
Tree.root.right.right = Node(8)

print(Tree.LOOKUP(11))
print(Tree.LOOKUP(13))

输出:

True
False

【讨论】:

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