【Python3】 LeetCode 7月挑战题目之22 - Binary Tree Zigzag Level Order Traversal

第二十二天问:Binary Tree Zigzag Level Order Traversal

这次题目要求要对二叉树进行锯齿形层次遍历 (Zigzag Level Order Traversal)。意思就是,现在这二叉树每个节点只包含一个整数,然后从顶层开始遍历,以次先从左往右,到下一层遍历再从右往左,以此类推,层与层之间交替进行。

大家好,我是一个喜欢研究算法、机械学习和生物计算的小青年,我的CSDN博客是:一骑代码走天涯
如果您喜欢我的笔记,那么请点一下关注、点赞和收藏。如果內容有錯或者有改进的空间,也可以在评论让我知道。😄

题目&示例 (引用自 LeetCode)

按此进入题目链结

Given a binary tree, return the zigzag level order traversal of its nodes’ values. (ie, from left to right, then right to left for the next level and alternate between).
For example:
Given binary tree [3,9,20,null,null,15,7],

Example:

 3
/ \
9  20
  /  \
 15   7

return its zigzag level order traversal as:
[
  [3],
  [20,9],
  [15,7]
]

解题思路

我在解这题的时候,想到的最简单的就是跟所有遍历法一样:把所有节点都遍历一次,把数值放到列表中再返回出来。

这次我採用了原始的迭代而非递归来完成题目。其中,在每次迭代开始前,都会透过一个变数left_or_right来检查是从左到右,还是从右到左遍历,直到记録每层节点currNodes的列表只包含Null才结束。

代码 (已提交,通过)

时间复杂度:O(​ n ​ n​ n)
空间复杂度:O( n n n)

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def zigzagLevelOrder(self, root: TreeNode) -> List[List[int]]:
        res = []
        if root is None:
            return res
        currNodes = [root]
        left_or_right = 0 # %2 == 0:next is right; %2 == 1:next is left
        while True:
            while True:
                try:
                    currNodes.remove(None)
                except:
                    break
            if len(currNodes) == 0:
                break
            nextNodes = []
            sub_vals = []
            for node in currNodes:
                sub_vals.append(node.val)
            res.append(sub_vals)
            if left_or_right % 2 == 0: # next from right
                for node in reversed(currNodes):
                    nextNodes.append(node.right)
                    nextNodes.append(node.left)
            elif left_or_right % 2 == 1: # next from left
                for node in reversed(currNodes):
                    nextNodes.append(node.left)
                    nextNodes.append(node.right)
            currNodes = nextNodes
            left_or_right += 1
        return res       
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值