《剑指offer》面试题32:从上到下打印二叉树I,II,III

I、从上到下打印出二叉树的每个节点,同一层的节点按照从左到右的顺序打印。

例如:
给定二叉树: [3,9,20,null,null,15,7],

    3
   / \
  9  20
    /  \
   15   7
返回:

[3,9,20,15,7]

思路:利用BFS+队列直接遍历,非常基本的一个算法没啥说的。

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution:
    def levelOrder(self, root: TreeNode) -> List[int]:
        if not root: return [] 
        queue= collections.deque()
        queue.append(root) 
        res = []  
        while queue:
            node = queue.popleft()  
            res.append(node.val) 
            
            if node.left:  
                queue.append(node.left)
            if node.right:
                queue.append(node.right)
        return res

II、从上到下按层打印二叉树,同一层的节点按从左到右的顺序打印,每一层打印到一行
 

例如:
给定二叉树: [3,9,20,null,null,15,7],
    3
   / \
  9  20
    /  \
   15   7
返回其层次遍历结果:

[
  [3],
  [9,20],
  [15,7]
]

思路:还是利用BFS+队列的手法去解题,不过需要把每一层的单独放在一个列表中,因此需要知道每次更新了几个节点到队列中去,因此采用一个for循环,根据len的长度就知道上次添加了几个元素进去就可以解决了。

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution:
    def levelOrder(self, root: TreeNode) -> List[List[int]]:
        if not root:
            return []
        q = collections.deque()
        q.append(root)
        res = []
        while q:
            temp = []
            for i in range(len(q)):
                node = q.popleft()
                temp.append(node.val)
                if node.left:
                    q.append(node.left)
                if node.right:
                    q.append(node.right)
            res.append(temp)
        return res

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

例如:
给定二叉树: [3,9,20,null,null,15,7],

    3
   / \
  9  20
    /  \
   15   7
返回其层次遍历结果:

[
  [3],
  [20,9],
  [15,7]
]

思路:本题和上一个题比较起来,稍有变形;是一个Z字走法,先从左到右在从右到左。我们采用奇数偶数或者其它办法都可以解决,将第0层设为偶数,第1层是奇数,这样来操作。如果是奇数那么操作不变,如果是偶数的话,那就需要把遍历到的元素翻转,然后添加到结果集就可以了。

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution:
    def levelOrder(self, root: TreeNode) -> List[List[int]]:
        if not root:return []
        q = collections.deque()
        q.append(root)
        res = []
        #当然也可以用一个flag标志是没问题的,每次更新flag就可以了
        #flag = -1
        while q:
            temp = []
            for i in range(len(q)):
                node = q.popleft()
                temp.append(node.val)
                if node.left:
                    q.append(node.left)
                if node.right:
                    q.append(node.right)
            #如果余数为0,不做任何操作,第一层照常操作  
            if len(res)%2==0:
                res.append(temp)
            #如果和上层不一样的话,那就把得到的结果翻转一下就欧克了
            else:
                res.append(temp[::-1])
        return res

总结:二叉树的层次遍历三种变形总结一下都是利用BFS+双端队列进行操作,这三个题第一个最最最基本,其余的几个都需要稍微变一点,总体的框架是没有任何改变的。

你可能感兴趣的:(Leetcode,树)