二叉树的遍历方式

  分别为中序遍历(左子树->当前节点->右子树)、前序遍历(当前节点->左子树->右子树)、后序遍历(左子树->右子树->当前节点)。下面使用JavaScript语言实现二叉树的三种遍历算法。

  首先构造一个排序二叉树(即满足左子节点比父节点小,右子节点比父节点大的二叉树),然后对其分别进行中序、前序、后序遍历。

排序二叉树结构图如下图所示:

说明:

  其中8为根节点(没有父节点的节点),4,、7、13为叶子节点(最后一层上没有子节点的节点),3、10、1、6、14为中间节点。

该树的最大深度为4(共4层)。

具体代码:

<!DOCTYPE html>
<html lang="en">
<head>
<title>javaScript实现二叉树算法</title>
</head>
<body>
<script type="text/javascript"> function BinaryTree(){
var Node = function(key) {//定义节点,包括父节点,左子节点,右子节点
this.key = key;//传入的元素值作为父节点
this.left = null;//左子节点初始为null
this.right = null;//右子节点初始为null
}; var root = null;//设置根节点初始值为空 // 定义插入节点函数,入参为当前节点和新加的节点
var insertNode = function(node, newNode) {
if (newNode.key < node.key) {//若新节点的父节点值小于的当前的节点的父节点值,则往左半部分走
if (node.left === null) {//当前节点若没有左子节点,则新节点作为当前节点的左子节点
node.left = newNode;
} else {//若当前节点的左子节点存在,则递归调用插入节点函数
insertNode(node.left, newNode);
}
} else {//若新节点的父节点值不小于当前节点的父节点值,则往右半部分走
if (node.right === null) {//若当前节点的右子节点不存在,则新节点作为当前节点的右子节点
node.right = newNode;
} else {//若当前节点的右子节点存在,则递归调用插入节点函数
insertNode(node.right, newNode);
}
}
}; this.insert = function(key) {//定义插入节点函数
var newNode = new Node(key);//定义新节点
if (root === null) {//若根节点为空,则新节点作为根节点
root = newNode;
} else {//若根节点存在,则执行插入节点函数
insertNode(root, newNode);
}
};
//中序遍历:左子树->当前节点->右子树,结果是一个升序有序序列
var inOrderTraverseNode = function(node, callback) {
if (node !== null) {//当前节点存在
inOrderTraverseNode(node.left, callback);//遍历左子树
callback(node.key);//执行回调函数
inOrderTraverseNode(node.right, callback);//遍历右子树
}
} this.inOrderTraverse = function(callback) {
inOrderTraverseNode(root, callback);
} //前序遍历:当前节点->左子树->右子树,常用于复制一个二叉树,效率高。
var preOrderTraverseNode = function(node, callback) {
if (node !== null) {//当前节点不为空
callback(node.key);//执行回调函数
preOrderTraverseNode(node.left, callback);//遍历左子树
preOrderTraverseNode(node.right, callback);//遍历右子树
}
} this.preOrderTraverse = function(callback) {
preOrderTraverseNode(root, callback);
} //后序遍历:左子树->右子树->当前节点,常用于文件系统遍历
var postOrderTraverseNode = function(node, callbakc) {
if (node !== null) {//当前节点不为空
postOrderTraverseNode(node.left, callback);//遍历左子树
postOrderTraverseNode(node.right, callback);//遍历右子树
callback(node.key);//执行回调函数
}
} this.postOrderTraverse = function(callback) {
postOrderTraverseNode(root, callback);
}
}
//测试二叉树排序
var nodes = [8, 3, 10, 1, 6, 14, 4, 7, 13];
var binaryTree = new BinaryTree();//实例化一个新的二叉树
nodes.forEach(function(key) {//遍历数组中的所有元素,执行二叉树排序操作,生成排序二叉树
binaryTree.insert(key);
});
//回调函数
var callback = function(key) {
console.log(key);//打印出当前节点值
}
//中序遍历测试
binaryTree.inOrderTraverse(callback);
//前序遍历测试
binaryTree.preOrderTraverse(callback);
//后序遍历测试
binaryTree.postOrderTraverse(callback); </script>
</body>
</html>

JavaScript实现二叉树算法的更多相关文章

  1. javascript数据结构与算法-- 二叉树

    javascript数据结构与算法-- 二叉树 树是计算机科学中经常用到的一种数据结构.树是一种非线性的数据结构,以分成的方式存储数据,树被用来存储具有层级关系的数据,比如文件系统的文件,树还被用来存 ...

  2. javascript数据结构与算法---二叉树(删除节点)

    javascript数据结构与算法---二叉树(删除节点) function Node(data,left,right) { this.data = data; this.left = left; t ...

  3. javascript数据结构与算法---二叉树(查找最小值、最大值、给定值)

    javascript数据结构与算法---二叉树(查找最小值.最大值.给定值) function Node(data,left,right) { this.data = data; this.left ...

  4. javascript数据结构与算法--二叉树遍历(后序)

    javascript数据结构与算法--二叉树遍历(后序) 后序遍历先访问叶子节点,从左子树到右子树,再到根节点. /* *二叉树中,相对较小的值保存在左节点上,较大的值保存在右节点中 * * * */ ...

  5. javascript数据结构与算法--二叉树遍历(先序)

    javascript数据结构与算法--二叉树遍历(先序) 先序遍历先访问根节点, 然后以同样方式访问左子树和右子树 代码如下: /* *二叉树中,相对较小的值保存在左节点上,较大的值保存在右节点中 * ...

  6. javascript数据结构与算法--二叉树遍历(中序)

    javascript数据结构与算法--二叉树遍历(中序) 中序遍历按照节点上的键值,以升序访问BST上的所有节点 代码如下: /* *二叉树中,相对较小的值保存在左节点上,较大的值保存在右节点中 * ...

  7. javascript数据结构与算法--二叉树(插入节点、生成二叉树)

    javascript数据结构与算法-- 插入节点.生成二叉树 二叉树中,相对较小的值保存在左节点上,较大的值保存在右节点中 /* *二叉树中,相对较小的值保存在左节点上,较大的值保存在右节点中 * * ...

  8. javascript数据结构与算法--散列

    一:javascript数据结构与算法--散列  一:什么是哈希表? 哈希表也叫散列表,是根据关键码值(key,value)而直接进行访问的数据结构,它是通过键码值映射到表中一个位置来访问记录的,散列 ...

  9. 为什么我要放弃javaScript数据结构与算法(第八章)—— 树

    之前介绍了一些顺序数据结构,介绍的第一个非顺序数据结构是散列表.本章才会学习另一种非顺序数据结构--树,它对于存储需要快速寻找的数据非常有用. 本章内容 树的相关术语 创建树数据结构 树的遍历 添加和 ...

随机推荐

  1. Tarjan缩点求入度为零的点的个数问题

    Description: 一堆人需要联系,但如果x 可以联系 y,你联系了x就不用联系y了,你联系一个人都会有固定的花费,问你最小联系多少人,和最小花费 Solution: Tarjan缩点,求出缩点 ...

  2. Uval4726-数形结合的思想

    题意:给定一段01序列,求一段长度不小于L的连续序列,使其平均值最大 思路:一看就想到了斜率优化,但是用基本的推公示一直没推出来,看了别人的代码,像推出斜率的式子一直没弄出来..后来一看别人写的题解, ...

  3. F - Cookies Piles

    Description The kids in my son's kindergarten made Christmas cookies with their teacher, and piled t ...

  4. 5.css背景以及书写位置

    1.样式表书写位置 ◆内嵌式写法 <head> <style type=”text/css”> 样式表写法 </style> </head> 2.◆外链 ...

  5. ora-12154 TNS:无法处理服务名疑难处理

    折腾了几天的PLSQL,终于解决这个问题,在此分享给需要的朋友 服务器:WindowsServer2008(64位操作系统).Win7(64位操作系统) Oracle版本:10.2.0 问题:安装完O ...

  6. IIS8.0配置网站,错误提示:用户 'IIS APPPOOL\你的网站名称'登录失败

    项目在vs2013中能正常运行,配置到服务器(windows2012+IIS8.0),运行提示用户 'IIS APPPOOL\DefaultAppPool' 登录失败. 解决方案: 比如我的网站取名m ...

  7. 自定义WPF窗体形状

    介绍 你好WPF爱好者. 随着WPF等统一API语言的发明,丰富用户界面变得非常容易. 创建丰富的用户界面只是一个想法. 您需要拥有的是创造性思维和最新技术融合. WPF和Expression Ble ...

  8. ASP.NET MVC NPOI导入Excel DataTable批量导入到数据库

    使用NPOI导入Excel 首先在MVC项目中导入NPOI 查询NPOI安装,排序依据,选择:最高下载量,选择第一个. 在控制器中创建ExcelController 在Index视图中写入代码: @u ...

  9. Spring Boot中使用Redis数据库

    引入依赖 Spring Boot提供的数据访问框架Spring Data Redis基于Jedis.可以通过引入spring-boot-starter-redis来配置依赖关系. <depend ...

  10. Swift5 语言参考(三) 类型

    在Swift中,有两种类型:命名类型和复合类型.一个名为类型是当它的定义可以给出一个特定名称的类型.命名类型包括类,结构,枚举和协议.例如,名为的用户定义类的实例MyClass具有该类型MyClass ...