Python:二叉树类:使用遍历进行重构

时间:2015-10-21 00:39:48

标签: python class tree binary-tree tree-traversal

我正在尝试创建一个使用我的ListBinaryTree:类的函数来构造和打印基于作为输入提示给出的inorder和preorder遍历的二叉树(以字符串形式,例如Inorder = 213,Preorder = 123)。我的二进制树类如下:

class ListBinaryTree:
"""A binary tree class with nodes as lists."""
DATA = 0    # just some constants for readability
LEFT = 1
RIGHT = 2   

def __init__(self, root_value, left=None, right=None):
    """Create a binary tree with a given root value
    left, right the left, right subtrees        
    """ 
    self.node = [root_value, left, right]

def create_tree(self, a_list):
    return ListBinaryTree(a_list[0], a_list[1], a_list[2])

def insert_value_left(self, value):
    """Inserts value to the left of this node.
    Pushes any existing left subtree down as the left child of the new node.
    """
    self.node[self.LEFT] = ListBinaryTree(value, self.node[self.LEFT], None)

def insert_value_right(self, value):
    """Inserts value to the right of this node.
    Pushes any existing left subtree down as the left child of the new node.
    """      
    self.node[self.RIGHT] = ListBinaryTree(value, None, self.node[self.RIGHT])

def insert_tree_left(self, tree):
    """Inserts new left subtree of current node"""
    self.node[self.LEFT] = tree

def insert_tree_right(self, tree):
    """Inserts new left subtree of current node"""
    self.node[self.RIGHT] = tree

def set_value(self, new_value):
    """Sets the value of the node."""
    self.node[self.DATA] = new_value

def get_value(self):
    """Gets the value of the node."""
    return self.node[self.DATA]

def get_left_subtree(self):
    """Gets the left subtree of the node."""
    return self.node[self.LEFT]

def get_right_subtree(self):
    """Gets the right subtree of the node."""
    return self.node[self.RIGHT]

def __str__(self):
    return '['+str(self.node[self.DATA])+', '+str(self.node[self.LEFT])+', '+\
 str(self.node[self.RIGHT])+']'

到目前为止,我有以下内容:

def reconstruct():
    inorder = input("Please enter the inorder sequence:")
    preorder = input("Please enter the preorder sequence:")
    #root = preorder[0]
    #left_bottom = inorder[0]
    #right_bottom = inorder[len(inorder)-1]
    my_tree = ListBinaryTree(int(preorder[0]))
    my_tree.insert_tree_left(int(inorder[0]))
    my_tree.insert_tree_right(int(inorder[len(inorder)-1]))
    print (my_tree)

但它仅适用于1或2级的树: 输出的一个例子是:

调用函数

reconstruct()

提示:

Please enter the inorder sequence:213
Please enter the preorder sequence:123

打印结果:

[1, 2, 3]

如何更改我的函数以便它可以构造一个理论上无限量遍历/更高级别的树?

1 个答案:

答案 0 :(得分:2)

首先,发布的代码不能正常显示:该类没有构造函数参数。最重要的是,您需要查阅您的课程材料,以了解如何从两个给定的订单重建树。

  • 有序的头是树的根。
  • 在预订中找到此元素。
  • 此时拆分预订单:根目录前的元素 在它的左子树;后面的元素在右子树中。
  • 使用这些来类似地拆分inorder。
  • 重复左右子树的每一个。

这会让你前进吗?

让我们看看那个伪代码:

def build_tree(inorder, preorder):
    if len(inorder) == 1:
        make a one-node tree of this node
        return this tree
    head = inorder[0]
    head_pos = position of head in preorder[]
    left_pre = preorder[:head_pos]
    right_pre = preorder[head_pos+1:]
    left_in = inorder[1:-len(right_pre)]
    right_in = inorder[-len(right_pre):]
    left_tree = build_tree(left_in, left_pre)
    right_tree = build_tree(right_in, right_pre)
    make a tree that has
        head as its root
        left_tree as its left subtree
        right_tree as its right subtree
    return this tree