提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
今天还是二叉树捏
一、题目
二叉树的层序遍历
给你二叉树的根节点 root ,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。
示例
示例 1:
输入:root = [3,9,20,null,null,15,7]
输出:[[3],[9,20],[15,7]]
示例 2:
输入:root = [1]
输出:[[1]]
示例 3:
输入:root = []
输出:[]
提示
树中节点数目在范围 [0, 2000] 内
-1000 <= Node.val <= 1000
二、思路
二叉树层序遍历用的是队列,先把根结点进队,然后重复以下操作:队头结点左孩子进队;队头结点右孩子进队;出队
因为要将一层作为一个子列表输出,所以在实现上做一些小改动,加入 count_before和count_after变量, 记录本层和下层有几个结点,
并对其做整体操作
三、代码
# 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 levelOrder(self, root: Optional[TreeNode]) -> List[List[int]]:
#二叉树层序遍历用的是队列 先把根结点进队,然后重复以下操作:
#队头结点左孩子进队;队头结点右孩子进队;出队
queue=[root] #队列
count_before=1 #记录本层有几个结点
count_after=0 #记录下层有几个结点
relist=[] #返回值列表
#因为要将一层作为一个子列表输出,所以对其做整体操作
while(queue and queue[0]!=None):
temp=[] #子列表(一层)
for i in range(count_before): #count记录本层有几个结点,下一层有几个结点
temp.append(queue[i].val)
if(queue[i].left): #加上左孩子
count_after+=1
queue.append(queue[i].left)
if(queue[i].right): #加上右孩子
count_after+=1
queue.append(queue[i].right)
relist.append(temp) #记下值
queue=queue[count_before:] #删掉一层
count_before=count_after
count_after=0
return relist
四、 变例:
二叉树的锯齿形层序遍历
给你二叉树的根节点 root ,返回其节点值的 锯齿形层序遍历 。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。
示例
示例 1:
输入:root = [3,9,20,null,null,15,7]
输出:[[3],[20,9],[15,7]]
示例 2:
输入:root = [1]
输出:[[1]]
示例 3:
输入:root = []
输出:[]
提示
树中节点数目在范围 [0, 2000] 内
-100 <= Node.val <= 100
五、思路
整体思路跟上一题一样,但是 需要加一个flag 标志之字形方向
六、代码
# 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: Optional[TreeNode]) -> List[List[int]]:
#二叉树层序遍历用的是队列 先把根结点进队,然后重复以下操作:
#队头结点左孩子进队;队头结点右孩子进队;出队
queue=[root] #队列
count_before=1 #记录本层有几个结点
count_after=0 #记录下层有几个结点
relist=[] #返回值列表
flag=0 #标志之字形方向
#因为要将一层作为一个子列表输出,所以对其做整体操作
while(queue and queue[0]!=None):
temp=[] #子列表(一层)
for i in range(count_before): #count记录本层有几个结点,下一层有几个结点
temp.append(queue[i].val)
if(queue[i].left): #加上左孩子
count_after+=1
queue.append(queue[i].left)
if(queue[i].right): #加上右孩子
count_after+=1
queue.append(queue[i].right)
if(flag == 0):
relist.append(temp[:])
else:
relist.append(temp[::-1]) #记下值
flag=(flag+1)%2
queue=queue[count_before:] #删掉一层
count_before=count_after
count_after=0
return relist