// * 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个章节的知识。
关于阿里内部都在强烈推荐使用的“K8S+Docker学习指南”—《深入浅出Kubernetes:理论+实战》、《权威指南-第一本Docker书》,看完之后两个字形容,爱了爱了!
如果你也爱了,点击这里免费下载:“K8S+Docker”学习指南
kC0yX-1628215018372)]
[外链图片转存中…(img-DiFY67Fw-1628215018374)]
关于阿里内部都在强烈推荐使用的“K8S+Docker学习指南”—《深入浅出Kubernetes:理论+实战》、《权威指南-第一本Docker书》,看完之后两个字形容,爱了爱了!
如果你也爱了,点击这里免费下载:“K8S+Docker”学习指南