前端进阶之旅前端进阶之旅
基础篇
进阶篇
高频篇
精选篇
手写篇
面经篇
AI 篇
原理篇
每日一题
小程序题库
知识卡片NEW
  • 历年面经按年份追踪真实考点
  • 算法题库NEW在线编码即时判题
  • 专项自测100 题快速查漏
  • 业务场景题真实业务问题与追问
  • 查漏补缺常见问题解析
  • AI 模拟面试NEW模拟真实面试 + 报告
  • 前端基础
    • HTTP从报文一路讲到 HTTPS
    • 浏览器渲染、事件循环、进程
    • 计算机基础Linux、网络、操作系统
  • 进阶专项
    • 设计模式23 种模式怎么用
    • 前端系统进阶学习大型项目工程化
    • 前端综合文章长期沉淀的实践文
  • 工程与工具
    • Node学习指南从环境搭建到服务端
    • NPM工作流script、依赖与发布
    • Docker容器化部署上手
    • Canvas图形与动画实战
  • 路线与导图
    • 思维导图知识点全景图
    • 学习路线按图索骥不跑偏
    • AI 定制路线NEW按你的简历现排
    • AI 知识地图NEW串起全站知识点
  • 动态
    • AI 热点NEWAI 每日动态
    • 公众号动态公众号历史文章
    • 博客动态站长的技术博客
    • 开发者导航常用工具与文档站
AI 助手NEW
旧版
基础篇
进阶篇
高频篇
精选篇
手写篇
面经篇
AI 篇
原理篇
每日一题
小程序题库
知识卡片NEW
  • 历年面经按年份追踪真实考点
  • 算法题库NEW在线编码即时判题
  • 专项自测100 题快速查漏
  • 业务场景题真实业务问题与追问
  • 查漏补缺常见问题解析
  • AI 模拟面试NEW模拟真实面试 + 报告
  • 前端基础
    • HTTP从报文一路讲到 HTTPS
    • 浏览器渲染、事件循环、进程
    • 计算机基础Linux、网络、操作系统
  • 进阶专项
    • 设计模式23 种模式怎么用
    • 前端系统进阶学习大型项目工程化
    • 前端综合文章长期沉淀的实践文
  • 工程与工具
    • Node学习指南从环境搭建到服务端
    • NPM工作流script、依赖与发布
    • Docker容器化部署上手
    • Canvas图形与动画实战
  • 路线与导图
    • 思维导图知识点全景图
    • 学习路线按图索骥不跑偏
    • AI 定制路线NEW按你的简历现排
    • AI 知识地图NEW串起全站知识点
  • 动态
    • AI 热点NEWAI 每日动态
    • 公众号动态公众号历史文章
    • 博客动态站长的技术博客
    • 开发者导航常用工具与文档站
AI 助手NEW
旧版
  • JavaScript Part 1

    • Ajax总结篇
    • Canvas 绘制八大行星
    • DOM编程之API学习总结篇
    • JavaScript事件机制
    • JavaScript代码片段100个
    • JavaScript作用域分析总结
    • JavaScript原型链回顾
    • JavaScript及jQuery中的各种宽高属性图解
    • JavaScript工程项目的一系列最佳实践
    • JavaScript常用API合集
    • JavaScript数组、字符串、对象常用方法
    • JavaScript数组方法总结篇
    • JavaScript深浅拷贝
    • JavaScript运动框架之速度时间版本
    • JavaScript运行机制Event Loop
    • JavaScript防抖节流原理
    • Javascript中的复制粘贴功能
    • Javascript数组详解
    • OOP之原型与原型链
    • Object.defineProperty详解
    • V8源码浅析JS数组常见方法
    • await 在 forEach 中不生效解决方案
    • iframe+表单跨域提交POST请求
    • javascript笔记总结篇
    • 业务中处理数据结构常用的JS方法
    • 作用域
    • 你真的掌握变量和类型了吗
    • 前后端分离之数据Mock
    • 原型与原型链
    • 原生JS补给(上)
    • 如何写出一个惊艳面试官的深拷贝
    • 带你填一些JS容易出错的坑
    • 彻底弄懂 JavaScript 执行机制
    • 执行上下文 执行栈
    • 正则回顾总结
    • 正则基础知识
    • 正则完整篇
    • 正则表达式
    • 浅析Promise原理
    • 浅谈JavaScript中的异步处理
    • 深拷贝 vs 浅拷贝
    • 聊一聊typeof instanceof 实现原理.
    • 聊一聊闭包
    • 高阶函数map reduce filter
  • JavaScript Part 2

  • CSS

  • HTML

  • Jquery

  • ES6

  • 小程序

  • Vue

  • React

  • 深入React

  • React Native

  • NodeJS

  • Angular

  • TypeScript

  • Webpack

  • 浏览器

  • 移动端

  • 前端工程化

  • Electron

  • HTTP

  • Nginx

  • Linux

  • 数据结构与算法

  • LeetCode算法题

  • 综合

完整面试题地址:
作者:程序员poetry
扫码关注作者公众号:「前端进阶之旅」 每天分享技术干货
前端进阶之旅公众号二维码

从上到下打印二叉树|博客系列

# 从上到下打印二叉树

例如有棵树是这样的:

			1
		/		\
  2				3
 /  \    /  \ 
4    6  7		 5
@前端进阶之旅: 代码已经复制到剪贴板

该课树转换为JS代码:

class Node {
  constructor (value, left = null, right = null) {
    this.value = value;
    this.left = left;
    this.right = right;
  }
}
const tree = new Node(1, new Node(2, new Node(4), new Node(6)), new Node(3, new Node(7), new Node(5)));
@前端进阶之旅: 代码已经复制到剪贴板

(为后面三题的前置条件)

# 题目1-不分行从上到下打印

# 题目描述

从上往下打印出二叉树的每个节点,同层节点从左至右打印。

需要输出:

[1, 2, 3, 4, 6, 7, 5]
@前端进阶之旅: 代码已经复制到剪贴板

# 解题思路

这道题其实很简单啦,看这输出结果,不就是求二叉树的广度遍历吗?

# coding

OK👌,直接开搞:

function print(node) {
  let list = [];
  let stack = [node];
  while (stack.length !== 0) {
    node = stack.shift();
    list.push(node.value);
    if (node.left) stack.push(node.left);
    if (node.right) stack.push(node.right);
  }
  return list;
}
console.log(print(tree));
@前端进阶之旅: 代码已经复制到剪贴板

# 题目2-把二叉树打印成多行

# 题目描述

从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。

需要输出:

[
	[1],
	[2, 3],
	[4, 6, 7, 5]
]
@前端进阶之旅: 代码已经复制到剪贴板

# 解题思路

  • 总体来说还是需要使用广度遍历
  • 需要定义一个二维数组result来盛放每一层的结果,也就是最后的输出结果
  • 需要一个数组tempArr来盛放当前这层所有节点的值
  • 需要一个变量来记录当前这层的节点数量currentNums
  • 需要一个变量来记录当前这层的孩子节点的数量childNums
  • 当前层遍历完成后开始遍历孩子节点,currentNums赋值为childNums,childNums赋值为0

# coding

function print (node) {
  let result = [];
  let tempArr = [];
  let currentNums = 1;
  let childNums = 0;
  let stack = [node];
  while (stack.length !== 0) {
    node = stack.shift();
    tempArr.push(node.value);
    if (node.left) {
      stack.push(node.left);
      childNums++;
    }
    if (node.right) {
      stack.push(node.right);
      childNums++;
    }
    currentNums--;
    if (currentNums === 0) {
      currentNums = childNums;
      childNums = 0;
      result.push(tempArr);
      tempArr = [];
    }
  }
  return result;
}
@前端进阶之旅: 代码已经复制到剪贴板

# 题目3-按之字形顺序打印二叉树

# 题目描述

请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。

需要输出:

[
	[1],
	[3, 2],
	[4, 6, 7, 5]
]
@前端进阶之旅: 代码已经复制到剪贴板

# 解题思路

解法一

可以将题目2中得到的二维数组处理一下:把偶数层的数组使用reserve逆序排一下就行了。

解法二

每一层是从左到右打印还是从右到左打印是由谁决定的呢?

例如我们定义了一个数组stack用来放某个节点下的子节点。

这里有一颗超级简单的树:

			1
		/		\
  2				3
@前端进阶之旅: 代码已经复制到剪贴板

stack是长[2, 3]或是长[3, 2],其实只是由push的顺序决定的而已。

  • 若当前层为奇数层,从左到右打印,同时填充下一层,从右到左打印(先填充左孩子节点再填充右孩子节点)。
  • 若当前层为偶数层,从右到左打印,同时填充下一层,从左到右打印(先填充右孩子节点再填充左孩子节点)。

# coding

解法一

function print (node) {
  let result = [];
  let tempArr = [];
  let currentNums = 1;
  let childNums = 0;
  let stack = [node];
  while (stack.length !== 0) {
    node = stack.shift();
    tempArr.push(node.value);
    if (node.left) {
      stack.push(node.left);
      childNums++;
    }
    if (node.right) {
      stack.push(node.right);
      childNums++;
    }
    currentNums--;
    if (currentNums === 0) {
      currentNums = childNums;
      childNums = 0;
      result.push(tempArr);
      tempArr = [];
    }
  }
  result = result.map((arr, idx) => {
    return (idx + 1) % 2 === 0 ? arr.reverse() : arr;
  })
  return result;
}
@前端进阶之旅: 代码已经复制到剪贴板

解法二

function print(node) {
  const result = [];
  const oddStack = [];
  const evenStack = [];
  let temp = [];
  if (node) {
    oddStack.push(node)
    while (oddStack.length !== 0 || evenStack.length !== 0) {
      while (oddStack.length !== 0) {
        const current = oddStack.shift();
        temp.push(current.value);
        if (current.right) {
          evenStack.push(current.right);
        }
        if (current.left) {
          evenStack.push(current.left);
        }
      }
      if (temp.length > 0) {
        result.push(temp);
        temp = [];
      }
      while (evenStack.length !== 0) {
        const current = evenStack.shift();
        temp.push(current.value);
        if (current.left) {
          oddStack.push(current.left)
        }
        if (current.right) {
          oddStack.push(current.right)
        }
      }
      if (temp.length > 0) {
        result.push(temp);
        temp = [];
      }
    }
  }
  return result;
}
@前端进阶之旅: 代码已经复制到剪贴板

← 二叉树中和为某一值的路径二叉树 →

fe
基础篇
进阶篇
高频篇
精选篇
手写篇
面经篇
AI 篇
原理篇
每日一题
小程序题库
知识卡片NEW
  • 历年面经按年份追踪真实考点
  • 算法题库NEW在线编码即时判题
  • 专项自测100 题快速查漏
  • 业务场景题真实业务问题与追问
  • 查漏补缺常见问题解析
  • AI 模拟面试NEW模拟真实面试 + 报告
  • 前端基础
    • HTTP从报文一路讲到 HTTPS
    • 浏览器渲染、事件循环、进程
    • 计算机基础Linux、网络、操作系统
  • 进阶专项
    • 设计模式23 种模式怎么用
    • 前端系统进阶学习大型项目工程化
    • 前端综合文章长期沉淀的实践文
  • 工程与工具
    • Node学习指南从环境搭建到服务端
    • NPM工作流script、依赖与发布
    • Docker容器化部署上手
    • Canvas图形与动画实战
  • 路线与导图
    • 思维导图知识点全景图
    • 学习路线按图索骥不跑偏
    • AI 定制路线NEW按你的简历现排
    • AI 知识地图NEW串起全站知识点
  • 动态
    • AI 热点NEWAI 每日动态
    • 公众号动态公众号历史文章
    • 博客动态站长的技术博客
    • 开发者导航常用工具与文档站
AI 助手NEW
旧版
  • JavaScript Part 1

    • Ajax总结篇
    • Canvas 绘制八大行星
    • DOM编程之API学习总结篇
    • JavaScript事件机制
    • JavaScript代码片段100个
    • JavaScript作用域分析总结
    • JavaScript原型链回顾
    • JavaScript及jQuery中的各种宽高属性图解
    • JavaScript工程项目的一系列最佳实践
    • JavaScript常用API合集
    • JavaScript数组、字符串、对象常用方法
    • JavaScript数组方法总结篇
    • JavaScript深浅拷贝
    • JavaScript运动框架之速度时间版本
    • JavaScript运行机制Event Loop
    • JavaScript防抖节流原理
    • Javascript中的复制粘贴功能
    • Javascript数组详解
    • OOP之原型与原型链
    • Object.defineProperty详解
    • V8源码浅析JS数组常见方法
    • await 在 forEach 中不生效解决方案
    • iframe+表单跨域提交POST请求
    • javascript笔记总结篇
    • 业务中处理数据结构常用的JS方法
    • 作用域
    • 你真的掌握变量和类型了吗
    • 前后端分离之数据Mock
    • 原型与原型链
    • 原生JS补给(上)
    • 如何写出一个惊艳面试官的深拷贝
    • 带你填一些JS容易出错的坑
    • 彻底弄懂 JavaScript 执行机制
    • 执行上下文 执行栈
    • 正则回顾总结
    • 正则基础知识
    • 正则完整篇
    • 正则表达式
    • 浅析Promise原理
    • 浅谈JavaScript中的异步处理
    • 深拷贝 vs 浅拷贝
    • 聊一聊typeof instanceof 实现原理.
    • 聊一聊闭包
    • 高阶函数map reduce filter
  • JavaScript Part 2

  • CSS

  • HTML

  • Jquery

  • ES6

  • 小程序

  • Vue

  • React

  • 深入React

  • React Native

  • NodeJS

  • Angular

  • TypeScript

  • Webpack

  • 浏览器

  • 移动端

  • 前端工程化

  • Electron

  • HTTP

  • Nginx

  • Linux

  • 数据结构与算法

  • LeetCode算法题

  • 综合