剑指offer 面试题32 python版+解析:从上到下打印二叉树,把二叉树打印成多行,之字形打印二叉树

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/mabozi08/article/details/88821631

题目描述

从上往下打印出二叉树的每个节点,同层节点从左至右打印。

思路:数据容器是一个队列(先入先出)。在队列头部取出一个节点并打印它,然后先判断该节点时候有左子节点,如果有就把左子节点方到队列末尾,然后判断是否有右子节点,如果有的话就把右子节点放到队列末尾。重复此操作。

# -*- coding:utf-8 -*-
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None
class Solution:
    # 返回从上到下每个节点值列表,例:[1,2,3]
    def PrintFromTopToBottom(self, root):
        # write code here
        queue = []
        result = []
        if not root:
            return result
        queue.append(root)
        while len(queue):
            result.append(queue[0].val)
            node = queue.pop(0)
            if node.left:
                queue.append(node.left)
            if node.right:
                queue.append(node.right)
        return result

题目描述

从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。

# -*- 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
        queue = []
        result = []
        if not pRoot:
            return result
        queue.append(pRoot)
        while len(queue):
            row = []
            for i in queue:
                row.append(i.val)
            result.append(row)
            for i in range(len(queue)):
                node = queue.pop(0)
                if node.left:
                    queue.append(node.left)
                if node.right:
                    queue.append(node.right)
        return result

题目描述

请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。

思路:用两个栈来表示。odd=0代表当前是奇数行,odd=1代表当前是偶数行。stack1存放奇数行,stack2存放偶数行。如果当前是奇数行,则在stack2里先存放右节点再方左节点。如果当前是偶数行,则在stack1里先存放左节点再存放右节点。

# -*- 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
        result = []
        stack1 = []
        stack2 = []
        if not pRoot:
            return result
        odd = 0
        stack1.append(pRoot)
        while stack1 or stack2:
            row = []
            if odd==0:
                for i in stack1:
                    row.append(i.val)
            else:
                for i in stack2:
                    row.append(i.val)
            result.append(row)
            if odd == 0:
                for i in range(len(stack1)):
                    node = stack1.pop()
                    if node.right:
                        stack2.append(node.right)
                    if node.left:
                        stack2.append(node.left)
            if  odd ==1:
                for i in range(len(stack2)):
                    node = stack2.pop()
                    if node.left:
                        stack1.append(node.left)
                    if node.right:
                        stack1.append(node.right)
            odd = 1-odd
        return result

猜你喜欢

转载自blog.csdn.net/mabozi08/article/details/88821631