劍指offer:按之字形順序打印二叉樹(Python)


題目描述

請實現一個函數按照之字形打印二叉樹,即第一行按照從左到右的順序打印,第二層按照從右至左的順序打印,第三行按照從左到右的順序打印,其他行以此類推。
解題思路
先給定一個二叉樹的樣式:

前段時間做過一道題,其要求是:從上到下按層打印二叉樹,同一層結點從左至右輸出。每一層輸出一行。輸出是形如[[1], [2,3], [4,5,6,7]]。

而這道題所不同的地方是:其要求輸出的樣式是:[[1], [3,2], [4,5,6,7]]。和上段中的題目相比,這道題不僅要求按序輸出節點值,還要求包含以下信息:

1. 每一層所包含的樹節點;

2. 偶數層的樹節點需倒序。

所以求解這道題的思路可以說是上一題的升級版,我們同樣可以利用列表存儲節點,但不同的是列表每次只存儲一層的節點,在遍歷當前層節點的同時,存儲下一層的節點,以此類推。面對要求的偶數層倒序,亦有兩種解題思路,第一種是:獲取到所有節點的值后,將偶數層的節點值倒序。第二種則是在獲取節點的值的時候就倒序存入。以下給出兩種方式的Python代碼:

方式1:

1. 按序獲取每一層節點的值;

2. 將偶數層節點的值倒序。

# -*- coding:utf-8 -*-
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None
class Solution:
    def Print(self, pRoot):
        # write code here
        if not pRoot:
            return []
        resultArray = []
        curLayerNodes = [pRoot]
        isEvenLayer = True#Even:偶數
        while curLayerNodes:
            curLayerValues = []
            nextLayerNodes = []
            isEvenLayer = not isEvenLayer
            for node in curLayerNodes:
                curLayerValues.append(node.val)
                if node.left:
                    nextLayerNodes.append(node.left)
                if node.right:
                    nextLayerNodes.append(node.right)
            curLayerNodes = nextLayerNodes
            resultArray.append(curLayerValues[::-1]) if isEvenLayer else resultArray.append(curLayerValues)
        return resultArray

 

方式2:

獲取每一層的節點的值時,如果是偶數層,則將每個節點的值插入到列表的頭部,即實現了獲取節點值時如果是偶數層則倒序排列的效果:

# -*- coding:utf-8 -*-
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None
class Solution:
    def Print(self, pRoot):
        # write code here
        if not pRoot:
            return []
        resultArray = []
        curLayerNodes = [pRoot]
        isEvenLayer = True
        while curLayerNodes:
            curLayerValues = []
            nextLayerNodes = []
            isEvenLayer = not isEvenLayer
            for node in curLayerNodes:
                curLayerValues.insert(0,node.val) if isEvenLayer else curLayerValues.append(node.val)
                if node.left:
                    nextLayerNodes.append(node.left)
                if node.right:
                    nextLayerNodes.append(node.right)
            curLayerNodes = nextLayerNodes
            resultArray.append(curLayerValues)
        return resultArray

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM