在顺序遍历AVL树中:名称未定义

时间:2016-11-04 14:33:12

标签: python recursion avl-tree

我只是想知道是否有人能够帮助我。我试图做一个AVL树的横向颠倒。但我一直收到一个错误,我的功能名称是' r_in_order'没有定义。这里发生了什么,我错过了什么?这是代码:

class Node:
    """ A node in a BST. It may have left and right subtrees """
    def __init__(self, item, left = None, right = None):
        self.item = item
        self.left = left
        self.right = right

class BST:
    """ An implementation of a Binary Search Tree """
    def __init__(self):
        self.root = None

    def recurse_add(self, ptr, item):
        if ptr == None:
            return Node(item)
        elif item < ptr.item:
            ptr.left = self.recurse_add(ptr.left, item)
        elif item > ptr.item:
            ptr.right = self.recurse_add(ptr.right, item)
        return ptr

    def add(self, item):
        """ Add this item to its correct position on the tree """
        self.root = self.recurse_add(self.root, item)

    def r_count(self, ptr):
        if ptr == None:
            return 0
        else:
            return 1 + self.r_count(ptr.left) + self.r_count(ptr.right)

    def count(self): 
        return self.r_count(self.root)

    def r_height(self, ptr):
        if ptr == None:
            return 0
        else:
            return 1 + max(self.r_height(ptr.left), self.r_height(ptr.right))

    def height(self): 
        return self.r_height(self.root)

    def r_in_order(self, ptr):
        if ptr != None:
            r_in_order(ptr.left)
            print(ptr.item + " ", end="")
            r_in_order(ptr.right)


    def in_order(self): 
        return self.r_in_order(self.root)

然后我用这个来测试代码:

import sys
from BST import BST

def main():
    # Read each test case
    line = sys.stdin.readline()
    items = line.strip().split()
    nums = [int(item) for item in items]

    tree = BST()


    for num in nums:
        tree.add(num)

    print("Print the elements of the tree in order:")
    tree.in_order()

if __name__ == "__main__":
    main()

2 个答案:

答案 0 :(得分:1)

r_in_orderBST的一种方法。它只能在BST实例上调用(或者在实例作为第一个参数的类上调用),但在r_in_order本身的定义中,您尝试在没有实例的情况下使用它。从技术上讲,它并不存在于您尝试使用它的命名空间中。

您的功能定义应如下所示:

def r_in_order(self, ptr):
    if ptr != None:
        self.r_in_order(ptr.left)
        print(ptr.item + " ", end="")
        self.r_in_order(ptr.right)

答案 1 :(得分:0)

没有一般功能 r_in_order :您需要添加 self。来获取对您已经在内的方法的引用。在print语句中潜伏着一个语法错误。试试这个:

def r_in_order(self, ptr):
    if ptr != None:
        self.r_in_order(ptr.left)
        print(ptr.item, " ", end="")
        self.r_in_order(ptr.right)

这会运行,并产生以下内容(输入第一行)。

1 3 7 5 6 4 2
Print the elements of the tree in order:
1  2  3  4  5  6  7