2016-05-25 264 views
2

我想定义一个函数,它返回一个树节点值的列表。该列表按照水平顺序(从上到下,从左到右),如果缺少 孩子,则在其位置中插入“无”。从python二叉树打印python列表

这是二叉树执行

class BinaryTree: 

def __init__(self, data, left = None, right = None): 

    self.left = left 
    self.right = right 

def insert_left(self, data): 
    self.left = BinaryTree(data, left=self.left) 

def insert_right(self, data): 
    self.right = BinaryTree(data, right=self.right) 

def set_value(self, val): 
    self.key = val 

def get_value(self): 
    return self.key 

def create_string(self, indent): 
    string = str(self.key) + '---+' 
    if self.left: 
     string += '\n(l)' + indent + self.left.create_string(indent + ' ') 
    if self.right: 
     string += '\n(r)' + indent + self.right.create_string(indent + ' ') 
    return string 

def __str__(self): 
    return self.create_string(' ') 

def return_list(self, templist): 
    templist.append(self.key) 
    if self.left is None: 
     templist.append(None) 
    else: 
     self.left.return_list(templist) 
    if self.right is None: 
     templist.append(None) 
    else: 
     self.right.return_list(templist) 

def main():  
    tree = BinaryTree(3) 
    tree.insert_left(29) 
    tree.insert_right(4) 
    right = tree.get_right_subtree() 
    left = tree.get_left_subtree() 
    left.insert_left(26) 
    right.insert_right(2) 
    right2 = right.get_right_subtree() 
    right2.insert_left(9) 
    templist = [] 
    tree.return_list(templist) 
main()  

回答

1

添加整个.py文件。如果你运行这个它应该工作

from collections import deque 

class BinaryTree: 
    def __init__(self, data, left = None, right = None): 
     self.key = data 
     self.left = left 
     self.right = right 

    def insert_left(self, data): 
     self.left = BinaryTree(data, left=self.left) 

    def insert_right(self, data): 
     self.right = BinaryTree(data, right=self.right) 

    def get_left_subtree(self): 
     return self.left 

    def get_right_subtree(self): 
     return self.right 

    def set_value(self, val): 
     self.key = val 

    def get_value(self): 
     return self.key 

    def create_string(self, indent): 
     string = str(self.key) + '---+' 
     if self.left: 
      string += '\n(l)' + indent + self.left.create_string(indent + ' ') 
     if self.right: 
      string += '\n(r)' + indent + self.right.create_string(indent + ' ') 
     return string 

    def __str__(self): 
     return self.create_string(' ') 

    def return_list(self, templist): 
     templist.append(self.key) 
     if self.left is None: 
      templist.append(None) 
     else: 
      self.left.return_list(templist) 
     if self.right is None: 
      templist.append(None) 
     else: 
      self.right.return_list(templist) 


def return_b_list(tree,templist,queue): 
    if tree is None: 
     return; 
    queue.append(tree) 
    while len(queue) !=0: 
     node = queue.popleft() 
     if node is None: 
      templist.append(None) 
     else: 
      templist.append(node.key) 
      queue.append(node.left) 
      queue.append(node.right) 




def main():  
    tree = BinaryTree(3) 
    tree.insert_left(29) 
    tree.insert_right(4) 
    right = tree.get_right_subtree() 
    left = tree.get_left_subtree() 
    left.insert_left(26) 
    right.insert_right(2) 
    right2 = right.get_right_subtree() 
    right2.insert_left(9) 
    templist = [] 
    queue = deque() # you should do a from collections import deque 
    return_b_list(tree,templist,queue) 
    print tree.create_string(' ') 
    print templist 

main() 
+0

ahh我看到我做了什么错误的谢谢! –

0

你应该通过一个空单此功能

def return_list(self, templist): 
    templist.append(self.key) 
    if self.left is None: 
     templist.append(None) 
    else: 
     self.left.return_list(templist) 
    if self.right is None: 
     templist.append(None) 
    else: 
     self.right.return_list(templist) 

调用此方法templist将有你想要

+0

我打算用这个调用树=二叉树(2) tree.insert_left(31) tree.insert_right(5) 右= tree.get_right_subtree() 左= tree.get_left_subtree() left.insert_left (27) right.insert_right(1) right2 = right.get_right_subtree() right2.insert_left(7) –

+0

但是return_list有两个参数,所以在调用时我会用什么第二个参数,比如return_list(tree,.. 。) –

+0

不,这将是一个类的方法,所以你称为tree.retrun_list(templist)。 templist是一个空列表。 –

0

名单后如果你正在寻找广度优先的搜索,那么这种方法可能会帮助

def return_b_list(tree,templist,queue): 
    if tree is None: 
     return; 
    queue.append(tree) 
    while len(queue) !=0: 
     node = queue.popleft() 
     if node is None: 
      templist.append(None) 
     else: 
      templist.append(node.key) 
      queue.append(node.left) 
      queue.append(node.right) 

如何调用? (此方法不需要类的一部分)

def main():  
    tree = BinaryTree(3) 
    tree.insert_left(29) 
    tree.insert_right(4) 
    right = tree.get_right_subtree() 
    left = tree.get_left_subtree() 
    left.insert_left(26) 
    right.insert_right(2) 
    right2 = right.get_right_subtree() 
    right2.insert_left(9) 
    templist = [] 
    queue = deque() # you should do a from collections import deque 
    return_b_list(tree,templist,queue) 
    print templist 
+0

感谢Vikas :)! –

+0

它似乎不起作用它不给水平顺序遍历 –

+0

你得到的输出是什么 –

0

这不是一个答案,但只是想补充一点,我得到的结果,并澄清

$ python binarayTree.py 
3---+ 
(l) 29---+ 
(l)  26---+ 
(r) 4---+ 
(r)  2---+ 
(l)   9---+ 

[3, 29, 4, 26, None, None, 2, None, None, 9, None, None, None] 

下面是结果的解释名单

first level 3 
second level 29,4 
third level 26, None, None ,2 
fourth level None, None,9, None, None, None 
+0

你通过你提供的def return_list函数获得这个吗? –

+0

我不明白为什么我会得到不同的输出。我改变了代码升技取出自己,并添加了一个树参数,而不是 –

+0

东西必须是不同的,因为我复制粘贴一切,我的结果是不同于你的:/ –