【问题标题】:Binary Search Tree operations二叉搜索树操作
【发布时间】:2013-05-29 07:37:41
【问题描述】:

我正在尝试在 python 中实现二叉搜索树操作。到目前为止,我已经编写了一些代码来将节点添加到此搜索树(已排序)。 这是我的代码中的内容:

class TreeNode:

    def __init__(self, data):
        self.data = data
        self.lLink = None
        self.rLink = None

class BinaryTree:

    def __init__(self):
        self.root = None

    def AddNode(self, data):
        if self.root is None:
            self.root = TreeNode(data)
        else:
            if data < self.root.data:
                if self.root.lLink is None:
                    self.root.lLink = TreeNode(data)
                else:
                    AddNode(self.root.lLink, data)
            else:
                if self.root.rLink is None:
                    self.root.rLink = TreeNode(data)
                else:
                    AddNode(self.root.rLink, data)

    def InOrder(self, head):
        if self.root.lLink is not None:
            InOrder(self.root.lLink)
        print self.root.data,
        if self.root.rLink is not None:
            InOrder(self.root.rLink)

    myTree = BinaryTree()
    myTree.AddNode(15)
    myTree.AddNode(18)
    myTree.AddNode(14)

如何测试我的AddNode() 方法是否正确?我知道算法,但只是为了确定。 我想到的是创建一个 InOrder() 方法并尝试通过这个 InOrder 遍历打印元素。因此,我添加到树中的数据应按排序顺序显示。如果它按排序顺序显示,我会确定我的 AddNode() 和 InOrder() 方法都是正确的。

【问题讨论】:

  • 你不想 InOrder() 打印从最左边到最右边的数据吗?为什么 InOrder() 需要一个 head 参数...这是为了什么?
  • 这正是您应该如何测试插入功能。所以,你没有答案吗?你还想知道什么?
  • 哦等等,InOrder 根本不起作用。发布更改。

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


【解决方案1】:

您的BinaryTree 类有问题,将插入顺序更改为

myTree.AddNode(14)
myTree.AddNode(18)
myTree.AddNode(15)

引发错误 - NameError: global name 'AddNode' is not defined。

这是因为在AddNode(self.root.rLink, data) 和AddNode(self.root.lLink, data) 行中,您似乎在TreeNode 的实例上调用AddNode 函数,这是不可能的。我修复了您代码中的一些错误,现在应该可以正常工作了。

class TreeNode:
    def __init__(self, data):
        self.data = data
        self.lLink = None
        self.rLink = None

class BinaryTree:
    def __init__(self):
        self.root = None

    def AddNode(self, data):
        if self.root is None:
            self.root = TreeNode(data)
        else:
            self.AddHelper(data, self.root)

    def AddHelper(self, data, startingPoint):
        if data < startingPoint.data:
            if startingPoint.lLink is None:
                startingPoint.lLink = TreeNode(data)
            else:
                self.AddHelper(data, startingPoint.lLink)
        else:
            if startingPoint.rLink is None:
                startingPoint.rLink = TreeNode(data)
            else:
                self.AddHelper(data, startingPoint.rLink)

    def InOrder(self):
        self.InOrderHelper(self.root)

    def InOrderHelper(self, startingPoint):
        if startingPoint is None:
            return
        self.InOrderHelper(startingPoint.lLink)
        print startingPoint.data,
        self.InOrderHelper(startingPoint.rLink)

输出测试:

>>> myTree = BinaryTree()
>>> myTree.AddNode(14)
>>> myTree.AddNode(18)
>>> myTree.AddNode(15)
>>> myTree.InOrder()
14 15 18

【讨论】:

  • 我没有费心检查插入功能。 :D
  • 这就是 OP 的目标。他想检查一下它的正确性。我刚刚进去并修复了所有错误,如果您发现任何错误,请告诉我。 :)
【解决方案2】:

插入可能有点棘手,尤其是因为函数是树本身的一部分。因此,您在树上调用插入函数,但指定一个起点。这默认为 root,因此您可以在调用函数时保留参数。

另外,我认为您对self 在函数中的工作方式有点不清楚。您不能将它作为参数传递给函数,这似乎是您所做的。

class TreeNode:
    def __init__(self, data):
        self.data = data
        self.rLink = None
        self.lLink = None

class BinaryTree:
    def __init__(self):
        self.root = None

    def AddNode(self, data, node=None):
        if not node :
            node = self.root
        if self.root is None:
            self.root = TreeNode(data)
        else:
            if data < node.data:
                if node.lLink is None:
                    node.lLink = TreeNode(data)
                else:
                    self.AddNode(data, self.root.lLink)
            else:
                if node.rLink is None:
                    node.rLink = TreeNode(data)
                else:
                    self.AddNode(data, self.root.rLink)

    def InOrder(self, head):
        if head.lLink is not None:
            self.InOrder(head.lLink)
        print head.data,
        if head.rLink is not None:
            self.InOrder(head.rLink)

myTree = BinaryTree()
myTree.AddNode(14)
myTree.AddNode(15)
myTree.AddNode(18)
myTree.InOrder(myTree.root)

使用中序遍历测试插入函数是最好的方法。

这应该可行。如果您每次都使用self.root.lLink,您就不会走下坡路。 或者,您可以再编写一行代码来检查输出是否确实按升序排列。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    • 2012-04-09
    • 2011-05-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多