[ LeetCode 107 ] 二叉樹的層序遍歷 II

天天分享一個LeetCode題目node

天天 5 分鐘,一塊兒進步!python

LeetCode 層序遍歷,地址:leetcode-cn.com/problems/bi…markdown

樹結點類

class TreeNode(object):
    def __init__(self, val, left=None, right=None):
        self.val = val
        self.left = left
        self.right = right
複製代碼

層次遍歷

仍是和以前層次遍歷一樣的思路,須要將每一層的遍歷結點做爲單獨的列表放置到最後的結果列表中去app

以前普通的層次遍歷思路能夠看這裏:mp.weixin.qq.com/s/4skiCYIhc…oop

解法思路(利用隊列):ui

1.初始化一個隊列queue,而後將頭結點入隊,初始化一個結果集 res;spa

2.再初始化一個臨時隊列 level_queue 和 一個列表 level_res,循環訪問隊列 queue 中元素,並判斷其左右孩子,若是有孩子結點依次將孩子結點入隊level_queue,而且將當前結點入列表 level_rescode

3.將 level_queue 賦值給 queue,將 level_res 插入到結果集 res。完成一層的計算。隨後再執行第 2 點orm

4.打印結果集 res隊列

實現的代碼

def levelOrderBottom(self, root):
    res = []
    queue = collections.deque()
    queue.appendleft(root)
    while(queue):
        level_queue = []   # 記錄下一層的結點值
        level_res = []     # 記錄當前層的結點值
        for node in queue:
            if node.left:
                level_queue.append(node.left)
            if node.right:
                level_queue.append(node.right)
            level_res.append(node.val)
        # 將下一層的結點都入到queue中,進行下一層的遍歷
        queue = level_queue
        res.insert(0, level_res)
    return list(res)
複製代碼

我的感受很巧妙,可是四個初始化定義須要好好熟悉一下

完整代碼

# -*- coding:utf-8 -*-
# !/usr/bin/env python

import collections

# 樹結點類
class TreeNode(object):
    def __init__(self, val, left=None, right=None):
        self.val = val
        self.left = left
        self.right = right

class Solution(object):
    def levelOrderBottom(self, root):
        res = []
        queue = collections.deque()
        queue.appendleft(root)
        while(queue):
            level_queue = []   # 記錄下一層的結點值
            level_res = []     # 記錄當前層的結點值
            for node in queue:
                if node.left:
                    level_queue.append(node.left)
                if node.right:
                    level_queue.append(node.right)
                level_res.append(node.val)
            # 將下一層的結點都入到queue中,進行下一層的遍歷
            queue = level_queue
            res.insert(0, level_res)
        return list(res)


if __name__ == "__main__":
    # 新建節點
    root = TreeNode('A')
    node_B = TreeNode('B')
    node_C = TreeNode('C')
    node_D = TreeNode('D')
    node_E = TreeNode('E')
    node_F = TreeNode('F')
    node_G = TreeNode('G')
    node_H = TreeNode('H')
    node_I = TreeNode('I')
    # 構建二叉樹
    # A
    # / \
    # B C
    # / \ / \
    # D E F G
    # / \
    # H I
    root.left, root.right = node_B, node_C
    node_B.left, node_B.right = node_D, node_E
    node_C.left, node_C.right = node_F, node_G
    node_D.left, node_D.right = node_H, node_I

    s = Solution()
    print(s.levelOrderBottom(root))
複製代碼
相關文章
相關標籤/搜索