开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 8 天,点击查看活动详情
题目
剑指 Offer 32 - I. 从上到下打印二叉树
从上到下打印出二叉树的每个节点,同一层的节点按照从左到右的顺序打印。
示例:
给定二叉树: [3,9,20,null,null,15,7]
3
/ \
9 20
/ \
15 7
返回:
[3,9,20,15,7]
分析一
先按自己的思路来一版
首先定义一个数组作为最终的返回值
二叉树题目常规思路使用递归
那么我们的思路就是从上到下遍历每一层,
退出条件就是当前层的节点数为0时
递归内部的行为就是从左往右将当前节点值添加到结果数组中,然后在从左往右维护一个数组,作为下一次递归的输入值
递归结束,输出结果
实现
function levelOrder(root: TreeNode | null): number[] {
if (!root) return []
let res: number[] = []
function handle(list: TreeNode[]) {
if (!list.length) return
let tmp = []
for (let i = 0; i < list.length; i ++) {
const node = list[i]
res.push(node.val)
if (node.left) {
tmp.push(node.left)
}
if (node.right) {
tmp.push(node.right)
}
}
handle(tmp)
}
handle([root])
return res
};
分析二
看了解析有一种更合理的解决方式,使用队列的形式来解决,利用队列先进先出的特性,实现从上往下层层遍历
实现
function levelOrder(root: TreeNode | null): number[] {
if (!root) return []
let res: number[] = []
let queue: TreeNode[] = []
queue.push(root)
while(queue.length) {
const node = queue.shift()
res.push(node.val)
if (node.left) {
queue.push(node.left)
}
if (node.right) {
queue.push(node.right)
}
}
return res
};
题目
剑指 Offer 32 - II. 从上到下打印二叉树 II
从上到下按层打印二叉树,同一层的节点按从左到右的顺序打印,每一层打印到一行。
例如: 给定二叉树: [3,9,20,null,null,15,7]
3
/ \
9 20
/ \
15 7
返回其层次遍历结果:
[
[3],
[9,20],
[15,7]
]
分析
这道题和上一道类似,只是返回的数据结果不同,那么我们使用同样的思路在做一遍,只要最终结果处理一下
由于同层的需要作为一个数组返回,我们需要在循环的时候维护一个中间变量来存储同层的结果,在进行循环
实现
function levelOrder(root: TreeNode | null): number[][] {
if (!root) return []
let res: number[][] = []
let queue: TreeNode[] = []
queue.push(root)
while(queue.length) {
let tmp:number[] = []
let len = queue.length
let index = 0
while(index < len) {
const node = queue.shift()
tmp.push(node.val)
if (node.left) {
queue.push(node.left)
}
if (node.right) {
queue.push(node.right)
}
index ++
}
res.push(tmp)
}
return res
};