二叉树的递归算法
时间:2022-07-25
本文章向大家介绍二叉树的递归算法,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
二叉树
二叉树是一种特殊的数据结构,有一个根节点,根节点下面有一左一右两个子节点,每个子节点又有各自的子节点,层层深入成树状。
二叉树的遍历
关于二叉树的遍历我只学习了递归遍历,非递归遍历比较复杂还是很理解。
递归遍历分为先序,中序和后序。用三个字母表示递归遍历可以很好理解:
D: 访问根节点,L: 遍历根节点的左子树,R:遍历根节点的右子树。
先序遍历:DLR
中序遍历:LDR
后序遍历:LRD
先序遍历的递归算法
function preOrder(node) {
if (node) {
console.log(node.value);
preOrder(node.left);
preOrder(node.right);
}
}
中序遍历的递归算法
function inOrder(node) {
if (node) {
inOrder(node.left);
console.log(node.value);
inOrder(node.left);
}
}
后序遍历的递归算法
function postOrder(node) {
if (node) {
postOrder(node.left);
postOrder(node.right);
console.log(node.value);
}
}
更详细的二叉树算法可以查看这篇文章
定时问题
遇到的一个难题是如何实现间隔一段时间(500ms)改变节点的颜色,这就需要用到setTimeout()
这个方法。刚开始的想法是把定时函数写进递归函数里面,让每次递归都执行setTimeout()
,但是这个方法行不通,会改变每个节点出现的顺序,而且函数执行结束的时间小于定时时间,导致想要达到的效果一瞬间全部执行完毕,而不是按规定的时间一个一个出现,这个理解可能有点错误,但是没办法达到想要的效果,所以放弃。
我的方法是把遍历出来的值放进数组里,然后再用数组完成想要做的各种操作。
function preOrder(node) {
if (node) {
preOrder(node.left);
preOrder(node.right);
preList.push(node.value);
}
}
for (let i = 0; i < preList.length; i++) {
setTimeout(function() {
console.log(preList[i]); // 这样就可以按顺序每隔一段时间打印出一个数字
}, 500 * i);
}
- Go Template学习笔记
- Go语言实现控制台贪吃蛇
- 容灾半自动化的实现思路(二) (r7笔记第93天)
- Go 谚语
- DBA和开发同事的一些代沟(五) (r7笔记第92天)
- 55. 上传文件(Web版) | 厚土Go学习笔记
- ASM无法启动的问题分析(一)(r7笔记第87天)
- 54. 心跳的实现 | 厚土Go学习笔记
- 53. Socket服务三次握手的示例 | 厚土Go学习笔记
- 使用Beego+Swagger构建更好的API服务
- ASM无法启动的问题分析(二)(r7笔记第88天)
- 43. 等价二叉树 | 厚土Go学习笔记
- 51. Socket服务端和客户端使用TCP协议通讯 | 厚土Go学习笔记
- 50. RESTful API的简单实现 | 厚土Go学习笔记
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 1.7 C++运算符
- 探花交友_搭建开发环境
- 编程体系结构(04):JavaIO流文件管理
- Hadoop框架:HDFS简介与Shell管理命令
- OpenCV的Mat类型以及基本函数使用
- Hadoop框架:HDFS读写机制与API详解
- 编程体系结构(06):Java面向对象
- RabbitMQ在分布式系统中的应用
- spring5新特性
- 进阶!MyBatis-Plus(基于 Springboot 演示)
- 运维人员常用的Linux命令总结
- Java反射机制的原理及在Android下的简单应用
- 温故而知新:MySQL存储引擎入门介绍
- 终于明白 Java 为什么要加 final 关键字了!
- 学习git这一篇就够了!!!