劍指offer系列——按之字形順序列印二叉樹,把二叉樹列印成多行,序列化二叉樹
阿新 • • 發佈:2018-11-11
按之字形順序列印二叉樹
題目描述
請實現一個函式按照之字形列印二叉樹,即第一行按照從左到右的順序列印,第二層按照從右至左的順序列印,第三行按照從左到右的順序列印,其他行以此類推。
解題思路:
法一:
需要兩個棧。我們在列印某一行節點時,把下一層的子節點儲存到相應的棧裡。
如果當前列印的奇數層,則先儲存左子節點再儲存右子節點到第一個棧裡;
如果當前列印的是偶數層,則先儲存右子節點再儲存左子節點到第二個棧裡。
法二: 轉換思路,儲存的時候一直從左向右儲存,列印的時候根據不同的層一次列印
程式碼:
法一:
# -*- 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 [] result, nodes = [], [pRoot] right = True while nodes: nextStack, curStack = [],[] #兩個棧 if right: for node in nodes: curStack.append(node.val) if node.left: nextStack.append(node.left) if node.right: nextStack.append(node.right) else: for node in nodes: curStack.append(node.val) if node.right: nextStack.append(node.right) if node.left: nextStack.append(node.left) nextStack.reverse() right = not right result.append(curStack) nodes = nextStack return result
法二:
# -*- 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 [] nodes, result, leftToright = [pRoot],[],True while nodes: curStack, nextStack = [], [] for node in nodes: curStack.append(node.val) if node.left: nextStack.append(node.left) if node.right: nextStack.append(node.right) if not leftToright: curStack.reverse() if curStack: result.append(curStack) nodes = nextStack leftToright = not leftToright return result
把二叉樹列印成多行
題目描述
從上到下按層列印二叉樹,同一層結點從左至右輸出。每一層輸出一行。
解題思路:
用兩個棧來實現,一個存第一行的curStack,第二級存第一行對應的left,right的值nextStack,每次結束一輪迴圈,把curStack給result,再將nodes設為nextStack,繼續迴圈。
程式碼:
# -*- coding:utf-8 -*- # class TreeNode: # def __init__(self, x): # self.val = x # self.left = None # self.right = None class Solution: # 返回二維列表[[1,2],[4,5]] def Print(self, pRoot): # write code here if not pRoot: return [] result, nodes, right = [],[pRoot],True while nodes: curStack, nextStack=[],[] for node in nodes: curStack.append(node.val) if node.left: nextStack.append(node.left) if node.right: nextStack.append(node.right) result.append(curStack) nodes = nextStack return result
序列化二叉樹
題目描述
請實現兩個函式,分別用來序列化和反序列化二叉樹
解題思路:
二叉樹的序列化就是採用前序遍歷二叉樹輸出節點,再碰到左子節點或者右子節點為None的時候,輸出一個特殊字元”#”。
二叉樹的反序列化,就是針對輸入的一個序列,構建一棵二叉樹。
我們可以設定一個指標先指向序列的最開始,然後把指標指向位置的數字轉化為二叉樹的結點,後移一個數字,繼續
轉化為左子樹和右子樹。當遇到當前指向的字元為特殊字元”#”或者指標超出了序列的長度,則返回None,指標後移,繼續遍歷。
程式碼:
# -*- coding:utf-8 -*-
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def Serialize(self, root):
# write code here
if not root:
return '#'
return str(root.val)+','+self.Serialize(root.left)+','+self.Serialize(root.right)
def Deserialize(self, s):
# write code here
list = s.split(',')
return self.deserializeTree(list)
def deserializeTree(self, list):
if len(list)<=0:
return None
val = list.pop(0)
root = None
if val != '#':
root = TreeNode(int(val))
root.left = self.deserializeTree(list)
root.right = self.deserializeTree(list)
return root