题目
剑指 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 };