2021网易Java高级面试题总结,大厂首发:必考的算法与数据结构

// * this.val = (val=undefined ? 0 : val)
// * this.left = (left
=undefined ? null : left)
// * this.right = (right===undefined ? null : right)
// * }
let preorderTraversal = (root, arr = []) => {
if(root) {
arr.push(root.val)
preorderTraversal(root.left, arr)
preorderTraversal(root.right, arr)
}
return arr
}


非递归版本👇

对于非递归的话,我们需要借助一个数据结构去存储它的节点,需要使用的就是栈,它的思路可以借鉴👇

*   根节点为目标节点,开始向它子节点遍历
*   1.访问目标节点
*   2.左孩子入栈 -> 直至左孩子为空的节点
*   3.节点出栈,以右孩子为目标节点,再依次执行1、2、3

let preorderTraversal = (root, arr = []) => {
const stack = [], res = []
let current = root
while(current || stack.length > 0) {
while (current) {
res.push(current.val)
stack.push(current)
current = current.left
}
current = stack.pop()
current = current.right
}
return res
}


* * *

### 中序遍历

给定一个二叉树,返回它的中序 遍历。

示例:

> 输入: [1,null,2,3] 1
> 2 / 3
> 
> 输出: [1,3,2]

进阶: 递归算法很简单,你可以通过迭代算法完成吗?

来源:力扣(LeetCode)著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

* * *

递归版本👇

const inorderTraversal = (root, arr = []) => {
if(root) {
inorderTraversal(root.left, arr)
arr.push(root.val)
inorderTraversal(root.right, arr)
}
return arr
}


非递归版本,这里就不解释了,跟前序遍历一样,思路一样,用栈维护节点信息。

const inorderTraversal = (root, arr = []) => {
const stack = [], res = []
let current = root
while(current || stack.length > 0) {
while (current) {
stack.push(current)
current = current.left
}
current = stack.pop()
res.push(current.val)
current = current.right
}
return res
}


### 后续遍历

给定一个二叉树,返回它的 后序 遍历。

示例:

> 输入: [1,null,2,3]
> 1
> 2 / 3
> 
> 输出: [3,2,1]

进阶: 递归算法很简单,你可以通过迭代算法完成吗?

来源:力扣(LeetCode)著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

* * *

递归版本👇

const postorderTraversal = (root, arr = []) => {
if(root) {
postorderTraversal(root.left, arr)
postorderTraversal(root.right, arr)
arr.push(root.val)
}
return arr
}


非递归版本👇

其实,嗯,做完前面两个后,会发现都是有套路滴~

const postorderTraversal = (root, arr = []) => {
const stack = [], res = []
let current = root, last = null // last指针记录上一个节点
while(current || stack.length > 0) {
while (current) {
stack.push(current)
current = current.left
}
current = stack[stack.length - 1]
if (!current.right || current.right == last) {
current = stack.pop()
res.push(current.val)
last = current
current = null // 继续弹栈
} else {
current = current.right
}
}
return res
}


### [二叉树的层次遍历 ⭐⭐](https://gitee.com/vip204888/java-p7)



给你一个二叉树,请你返回其按 **层序遍历** 得到的节点值。 (即逐层地,从左到右访问所有节点)。

示例: 二叉树:[3,9,20,null,null,15,7],

> 3
> 
> /
> 9 20 /
> 15 7

返回其层次遍历结果:

> [ [3], [9,20], [15,7] ]

来源:力扣(LeetCode) 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

* * *

递归版本👇

const levelOrder = function(root) {
if(!root) return []
let res = []
dfs(root, 0, res)
return res
}

function dfs(root, step, res){
if(root){
if(!res[step]) res[step] = []
res[step].push(root.val)
dfs(root.left, step + 1, res)
dfs(root.right, step + 1, res)
}
}


非递归版本👇

这里借助的就是队列这个数据结构,先进先出的机制。

const levelOrder = (root) => {
let queue = [], res = []
if (root) queue.push(root);
while (queue.length) {
let next_queue = [],
now_res = []
while (queue.length) {
root = queue.shift()
now_res.push(root.val)
root.left && next_queue.push(root.left)
root.right && next_queue.push(root.right)
}
queue = next_queue
res.push(now_res)

最后

权威指南-第一本Docker书

引领完成Docker的安装、部署、管理和扩展,让其经历从测试到生产的整个开发生命周期,深入了解Docker适用于什么场景。并且这本Docker的学习权威指南介绍了其组件的基础知识,然后用Docker构建容器和服务来完成各种任务:利用Docker为新项目建立测试环境,演示如何使用持续集成的工作流集成Docker,如何构建应用程序服务和平台,如何使用Docker的API,如何扩展Docker。

总共包含了:简介、安装Docker、Docker入门、使用Docker镜像和仓库、在测试中使用Docker、使用Docker构建服务、使用Fig编配Docke、使用Docker API、获得帮助和对Docker进行改进等9个章节的知识。

image

image

image

image

关于阿里内部都在强烈推荐使用的“K8S+Docker学习指南”—《深入浅出Kubernetes:理论+实战》、《权威指南-第一本Docker书》,看完之后两个字形容,爱了爱了!

如果你也爱了,点击这里免费下载:“K8S+Docker”学习指南

kC0yX-1628215018372)]

[外链图片转存中…(img-DiFY67Fw-1628215018374)]

关于阿里内部都在强烈推荐使用的“K8S+Docker学习指南”—《深入浅出Kubernetes:理论+实战》、《权威指南-第一本Docker书》,看完之后两个字形容,爱了爱了!

如果你也爱了,点击这里免费下载:“K8S+Docker”学习指南

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值