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

前段時間做過一道題,其要求是:從上到下按層打印二叉樹,同一層結點從左至右輸出。每一層輸出一行。輸出是形如[[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