69. 二叉樹的層次遍歷Python實現
阿新 • • 發佈:2019-02-07
''' 69. 二叉樹的層次遍歷 描述 給出一棵二叉樹,返回其節點值的層次遍歷(逐層從左往右訪問) 您在真實的面試中是否遇到過這個題? 樣例 給一棵二叉樹 {3,9,20,#,#,15,7} : 3 / \ 9 20 / \ 15 7 返回他的分層遍歷結果: [ [3], [9,20], [15,7] ] 下面這個題幫助理解 7. 二叉樹的序列化和反序列化 描述 設計一個演算法,並編寫程式碼來序列化和反序列化二叉樹。將樹寫入一個檔案被稱為“序列化”,讀取檔案後重建同樣的二叉樹被稱為“反序列化”。 如何反序列化或序列化二叉樹是沒有限制的,你只需要確保可以將二叉樹序列化為一個字串,並且可以將字串反序列化為原來的樹結構。 對二進位制樹進行反序列化或序列化的方式沒有限制,LintCode將您的serialize輸出作為deserialize的輸入,它不會檢查序列化的結果。 您在真實的面試中是否遇到過這個題? 樣例 給出一個測試資料樣例, 二叉樹{3,9,20,#,#,15,7},表示如下的樹結構: 3 / \ 9 20 / \ 15 7 我們的資料是進行BFS遍歷得到的。當你測試結果wrong answer時,你可以作為輸入除錯你的程式碼。 你可以採用其他的方法進行序列化和反序列化。 ''' class TreeNode: def __init__(self, val): self.val = val self.left, self.right = None, None class Solution: def serialize(self, root): if root is None: return "{}" queue = [root] index = 0 while index < len(queue): if queue[index] is not None: queue.append(queue[index].left) queue.append(queue[index].right) index += 1 while queue[-1] is None: queue.pop() return '{%s}' % ','.join([str(node.val) if node is not None else '#' for node in queue]) def deserialize(self, data): data = data.strip('\n') if data == '{}': return None vals = data[1:-1].split(',') #['3', '9', '20', '#', '#', '15', '7'] root = TreeNode(int(vals[0])) #[<__main__.TreeNode object at 0x1057d44a8>] queue = [root] #[<__main__.TreeNode object at 0x1057d44a8>] isLeftChild = True index = 0 for val in vals[1:]: if val is not '#': node = TreeNode(int(val)) if isLeftChild: queue[index].left = node else: queue[index].right = node queue.append(node) if not isLeftChild: index += 1 isLeftChild = not isLeftChild return root class Solution1: """ @param root: The root of binary tree. @return: Level order in a list of lists of integers """ def levelOrder(self, root): if not root: return [] queue = [root] results = [] while queue: next_queue = [] results.append([node.val for node in queue]) for node in queue: if node.left: next_queue.append(node.left) if node.right: next_queue.append(node.right) queue = next_queue return results my_solution = Solution() data = "{3,9,20,#,#,15,7}" deser = my_solution.deserialize(data) #把人能識別的東西序列化為機器能識別的. [<__main__.TreeNode object at 0x10d9e4198>] print(deser) ser = my_solution.serialize(deser) #把機器能識別的反序列化為人能識別的 print(ser) my_solution1 = Solution1() order = my_solution1.levelOrder(deser) #列印二叉樹分層遍歷結果;levelOrder括號裡面是root,但是我這裡放入的是整個二叉樹,怎麼就沒有報錯 print(order) 輸出: <__main__.TreeNode object at 0x10340e208> {3,9,20,#,#,15,7} [[3], [9, 20], [15, 7]] [Finished in 0.0s]
認識你是我們的緣分,同學,等等,記得關注我。
微信掃一掃
關注該公眾號