从二叉搜索树创建列表

时间:2011-04-05 01:09:32

标签: python binary-search-tree

我正在尝试列出二叉搜索树中的所有项目。我理解递归,但我不知道如何使它返回每个值,然后将其附加到列表中。我想创建一个名为makeList()的函数,它将返回树中所有项的列表。我的程序中的所有函数除makeList()函数外都有效,并且包含在内以确保每个人都了解我如何设置树的基本结构。

class Node(object):
    def __init__(self, data):
        self.data = data
        self.lChild = None
        self.rChild = None

class Tree(object):
    def __init__(self):
        self.root = None

    def __str__(self):
        current = self.root

    def isEmpty(self):
        if self.root == None:
            return True
        else:
            return False

    def insert (self, item):
        newNode = Node (item)
        current = self.root
        parent = self.root

        if self.root == None:
            self.root = newNode
        else:
            while current != None:
                parent = current
                if item < current.data:
                    current = current.lChild
                else:
                    current = current.rChild

            if item < parent.data:
                parent.lChild = newNode
            else:
                parent.rChild = newNode

    def inOrder(self, aNode):
        if aNode == None:
            pass
        if aNode != None:
            self.inOrder(aNode.lChild)
            print aNode.data
            self.inOrder(aNode.rChild)

    def makeList(self, aNode):
        a = []
        self.inOrder(aNode)
        a += [aNode.data]
        print a

n = Tree()
for i in [4,7,2,9,1]:
    n.insert(i)

n.makeList(n.root)

查看我的makeList()函数,我可以看到它为什么不起作用,但我不知道如何使它工作。

修改

好的,我懂了!我甚至得到了两个答案:

def makeList(self, aNode, a = []):
    if aNode != None:
        self.makeList(aNode.lChild, a)
        a += [aNode.data]
        self.makeList(aNode.rChild, a)
    return a

def makeList2(self, aNode):
    if aNode is None:
        return []
    return self.makeList2(aNode.lChild) + [aNode.data] + self.makeList2(aNode.rChild)

回头看,我可以看到我不太了解递归,所以是时候打书了!任何人都有很好的递归资源吗?

另一个问题,所以说我称之为makeList()功能。当Python经过makeList()时,当它到达self.makeList(aNode.lChild, a)时它会再次开始运行该函数,同时它仍在完成makeList()函数或者一切都停止并且它刚刚从它开始新aNode

我希望这是有道理的。

3 个答案:

答案 0 :(得分:1)

inOrder打印东西但不返回任何内容,因此它对构建列表毫无用处。您需要按顺序返回每个节点。这可能是您的课程尚未涉及的内容,但请查看yield命令。

答案 1 :(得分:1)

你真是太近了! makeList非常简单:

def makeList(self, aNode):
    if aNode is None:
        # Stop recursing here
        return []
    return self.makeList(aNode.lChild) + [aNode.data] + self.makeList(aNode.rChild)

基本上,请确保您没有尝试递归过去的空节点。然后返回左树的列表,当前节点和右树的列表。

答案 2 :(得分:0)

基本理念是这样的:

def makeList(self):
    return self.lChild.makeList() + [self.data] + self.rChild.makeList()

看看它与inOrder的基本相同之处是什么?

你的程序中有一个不同的结构,这使得它更难实现,但基本的想法是一样的。