Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/326.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
如何查找二叉树中是否存在值:True或False(Python3)_Python_Python 3.x_Binary Tree_Binary Search Tree_Lookup - Fatal编程技术网

如何查找二叉树中是否存在值:True或False(Python3)

如何查找二叉树中是否存在值:True或False(Python3),python,python-3.x,binary-tree,binary-search-tree,lookup,Python,Python 3.x,Binary Tree,Binary Search Tree,Lookup,我试图编写一个代码,如果值存在于二叉树中,那么输出将返回True或False 以下是我的尝试: 定义名为Node的类: class Node: def __init__(self, data): self.data = data self.left = None self.right = None 定义名为BinaryTree+查找函数的类: class BinaryTree: def __init__(self, rootdata): se

我试图编写一个代码,如果值存在于二叉树中,那么输出将返回True或False

以下是我的尝试:

定义名为Node的类:

class Node:

def __init__(self, data):
    
    self.data = data
    self.left = None
    self.right = None
定义名为BinaryTree+查找函数的类:

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
但是,我不断得到错误信息,
“BinaryTree”对象没有属性“data”

我知道函数查找的定义会有一些错误, 但我是否有可能保留此格式并仍然返回输出:

True
False

谢谢,

代码中的问题是:

  • 您正在尝试引用
    self.right
    (应改为
    self.root.right
    ,因为我们不在
    节点
    实例上)
  • 嵌套的if检查错误。如果NOTNone或返回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))

您应该像调用
Tree.LOOKUP(11,Tree.root)一样调用
LOOKUP
。然后递归地使用self.node.data/left/right
。这棵树应该是一棵二叉搜索树,还是一棵任意的二叉树,没有任何特定的顺序?因为
LOOKUP
方法的逻辑(在可以围绕其问题提取的范围内)似乎是针对搜索树的,如果它要正常工作,则需要有顺序。你肯定不是在建一棵有序的树。
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