开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第23天,点击查看活动详情
什么是二叉树
笔者总结:二叉树是每个节点最多有两个子树的树结构。它有五种基本形态:二叉树可以是空集;根可以有空的左子树或右子树可以为空;或者左、右子树皆为空。
什么是二叉树的层序遍历
举个例子,先画一个二叉树,如下图所示
然后一层一层来遍历,第一层只有A,第二层有B、C两节点,第三层有D、E、F、G四个节点,所以此二叉树层序遍历的结果为:A B C D E F G
二叉树层序遍历,先遍历的结点,先输出,后遍历的结点后输出,符合队列的特点。
循环的终结条件:
就是队列中所有的元素全部弹出
每次循环需要干什么
第一步:从上往下遍历二叉树,将树节点依次push入队列每一次我们再将一层中的节点push进入队列中,需要对当前层的节点进行计数(let size: number = queue.length;),然后,确认当前层有多少个节点是需要被弹出队列的
第二步:每弹出一个节点的时候需要判断他是否有左右子节点,如果有的话,需要将他的子节点从左往右push进入队列即可,完整代码如下所示:
/**
* Definition for a binary tree node.
* class TreeNode {
* val: number
* left: TreeNode | null
* right: TreeNode | null
* constructor(val?: number, left?: TreeNode | null, right?: TreeNode | null) {
* this.val = (val===undefined ? 0 : val)
* this.left = (left===undefined ? null : left)
* this.right = (right===undefined ? null : right)
* }
* }
*/
function levelOrder(root: TreeNode | null): number[][] {
if (root == null) return [];
let result: number[][] = []
let queue: TreeNode[] = [];
queue.push(root);
while(queue.length > 0){
let size: number = queue.length;
console.log('size:',size)
let arr: number[] = new Array();
while(size--){
let node: TreeNode = queue.shift()!;
arr.push(node.val);
if (node.left!=null) queue.push(node.left);
if (node.right!=null) queue.push(node.right);
}
result.push(arr)
}
return result;
};