【问题标题】:python binary search treepython二叉搜索树
【发布时间】:2013-04-12 08:51:04
【问题描述】:

由于某种原因,我似乎无法让“查找”方法起作用。我认为这与范围问题有关...... root.val 似乎没有在全球范围内更新。我收到一条错误消息说 AtributeError: 'int' object has no attribute 'val' 这是我目前的代码:

class BinaryNode:
    def __init__(self, v):
        self.val = v
        self.leftChild = None
        self.rightChild = None
    def get(self):
        return self.val
    def set(self, v):
        self.val = v
    def getChildren(self):
        children = []
        if self.leftChild != None:
            children.append(self.leftChild)
        if self.rightChild != None:
            children.append(self.rightChild)
        return children

class Tree:
    def __init__(self):
        self.root = None
    def setRoot(self, node):
        self.root = node
    def size(self):
        if self.root == None:
            return 0
    def subtreeSize(node):
        return 1 + sum(subtreeSize(c) for c in node.getChildren())
        return subtreeSize(self.root)

class BinarySearchTree(Tree):
    def insert(self, val):
        self.insertNode(self.root, val)

    def insertNode(self, node, val):
        if node is None:
            self.setRoot(BinaryNode(val))
        elif val <= node.val:
            node.leftChild = insertNode(BinaryNode(val), val)
        elif val > node.val:
            node.rightChild = insertNode(BinaryNode(val), val)
        else:
            node.val = val


    def find(self, val):
        self.findNode(self.root, val)

    def findNode(self, node, val):
        if node is None:
            return False
        elif val == node.val:
            return True
        elif val < node.val:
            self.findNode(val, node.leftChild)
        else:
            self.findNode(val, node.rightChild)


if __name__ == "__main__":
    btree = BinarySearchTree()
    vals = [5]
    for v in vals:
        btree.insert(v)
    tests = [8, 5]
    for t in tests:
        print "find(%i) = %s" % (t, ("True" if btree.find(t) else "False"))

【问题讨论】:

  • 您为什么要删除问题并拒绝其他人您获得的帮助?
  • 请不要不要删除问题。您在 CC Wiki 许可下发布了此内容(参见页面右下角),您的问题也是为了在未来帮助其他人
  • 如果你觉得你发错了(不想让你的教授发现?)那么你需要request to be disassociated from the post。不要简单地破坏它并否认那些帮助你赢得声誉和认可的人。

标签: python search binary-tree binary-search-tree


【解决方案1】:

你的findNode()方法有两个问题:

  1. 当您递归调用 nodeval 参数时,您交换了参数。这会导致您的代码尝试在整数值而不是节点上查找 .val

  2. 您忘记返回递归调用结果。

更正的方法:

def find(self, val):
    return self.findNode(self.root, val)

def findNode(self, node, val):
    if node is None:
        return False
    elif val == node.val:
        return True
    elif val < node.val:
        return self.findNode(node.leftChild, val)
    else:
        return self.findNode(node.rightChild, val)

你的下一个问题是你的insertNode 方法;您尝试在其中调用全局 insertNode() 函数;那可能应该是self.insertNode()。但是,该方法有 no 返回值,因此您最终将 node.leftChildnode.rightChild 设置为 None

您只想将插入点的搜索交给递归调用,无需使用返回值:

def insert(self, val):
    if self.root is None:
        self.setRoot(BinaryNode(val))
    else:
        self.insertNode(self.root, val)

def insertNode(self, node, val):
    if val <= node.val:
        if node.leftChild:
            self.insertNode(node.leftChild, val)
        else:
            node.leftChild = BinaryNode(val)
    elif val > node.val:
        if node.rightChild:
            self.insertNode(node.rightChild, val)
        else:
            node.rightChild = BinaryNode(val)

通过这些更改,您的简单测试打印出来:

find(8) = False
find(5) = True

【讨论】:

  • (+1) 很好地发现了交换的参数。我一直对异常感到困惑,这解释了它。
  • @BobertHido:不够有帮助,我接受?还有什么问题吗?我对代码进行了更多测试,它现在对我有用。
【解决方案2】:

findNode() 的一个问题是您缺少return 语句。

    elif val < node.val:
        self.findNode(val, node.leftChild)
    else:
        self.findNode(val, node.rightChild)

应该阅读

    elif val < node.val:
        return self.findNode(val, node.leftChild)
    else:
        return self.findNode(val, node.rightChild)

你在insertNode()有类似的问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-03
    • 2019-04-17
    • 1970-01-01
    相关资源
    最近更新 更多