1. 程式人生 > >劍指offer系列——按之字形順序列印二叉樹,把二叉樹列印成多行,序列化二叉樹

劍指offer系列——按之字形順序列印二叉樹,把二叉樹列印成多行,序列化二叉樹

按之字形順序列印二叉樹

題目描述

請實現一個函式按照之字形列印二叉樹,即第一行按照從左到右的順序列印,第二層按照從右至左的順序列印,第三行按照從左到右的順序列印,其他行以此類推。

解題思路:

法一:

需要兩個棧。我們在列印某一行節點時,把下一層的子節點儲存到相應的棧裡。

如果當前列印的奇數層,則先儲存左子節點再儲存右子節點到第一個棧裡;

如果當前列印的是偶數層,則先儲存右子節點再儲存左子節點到第二個棧裡。

法二: 轉換思路,儲存的時候一直從左向右儲存,列印的時候根據不同的層一次列印

程式碼:

法一:

# -*- 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