2016-05-25 262 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

東西必須是不同的,因爲我複製粘貼一切,我的結果是不同於你的:/ –