1. 程式人生 > >69. 二叉樹的層次遍歷Python實現

69. 二叉樹的層次遍歷Python實現

'''

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]


認識你是我們的緣分,同學,等等,記得關注我。

微信掃一掃
關注該公眾號