JavaScript实现二叉树算法

简介: JavaScript实现二叉树算法

二叉树的遍历方式


  分别为中序遍历(左子树->当前节点->右子树)前序遍历(当前节点->左子树->右子树)后序遍历(左子树->右子树->当前节点)。下面使用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>
相关文章
|
3天前
|
存储 监控 算法
局域网网络管控里 Node.js 红黑树算法的绝妙运用
在数字化办公中,局域网网络管控至关重要。红黑树作为一种自平衡二叉搜索树,凭借其高效的数据管理和平衡机制,在局域网设备状态管理中大放异彩。通过Node.js实现红黑树算法,可快速插入、查找和更新设备信息(如IP地址、带宽等),确保网络管理员实时监控和优化网络资源,提升局域网的稳定性和安全性。未来,随着技术融合,红黑树将在网络管控中持续进化,助力构建高效、安全的局域网络生态。
24 9
|
1天前
|
存储 算法 测试技术
【C++数据结构——树】二叉树的遍历算法(头歌教学实验平台习题) 【合集】
本任务旨在实现二叉树的遍历,包括先序、中序、后序和层次遍历。首先介绍了二叉树的基本概念与结构定义,并通过C++代码示例展示了如何定义二叉树节点及构建二叉树。接着详细讲解了四种遍历方法的递归实现逻辑,以及层次遍历中队列的应用。最后提供了测试用例和预期输出,确保代码正确性。通过这些内容,帮助读者理解并掌握二叉树遍历的核心思想与实现技巧。
14 2
|
9天前
|
监控 算法 JavaScript
基于 Node.js Socket 算法搭建局域网屏幕监控系统
在数字化办公环境中,局域网屏幕监控系统至关重要。基于Node.js的Socket算法实现高效、稳定的实时屏幕数据传输,助力企业保障信息安全、监督工作状态和远程技术支持。通过Socket建立监控端与被监控端的数据桥梁,确保实时画面呈现。实际部署需合理分配带宽并加密传输,确保信息安全。企业在使用时应权衡利弊,遵循法规,保障员工权益。
23 7
|
7天前
|
存储 监控 JavaScript
深度探秘:运用 Node.js 哈希表算法剖析员工工作时间玩游戏现象
在现代企业运营中,确保员工工作时间高效专注至关重要。为应对员工工作时间玩游戏的问题,本文聚焦Node.js环境下的哈希表算法,展示其如何通过快速查找和高效记录员工游戏行为,帮助企业精准监测与分析,遏制此类现象。哈希表以IP地址等为键,存储游戏网址、时长等信息,结合冲突处理与动态更新机制,确保数据完整性和时效性,助力企业管理层优化工作效率。
21 3
|
15天前
|
存储 算法 Python
文件管理系统中基于 Python 语言的二叉树查找算法探秘
在数字化时代,文件管理系统至关重要。本文探讨了二叉树查找算法在文件管理中的应用,并通过Python代码展示了其实现过程。二叉树是一种非线性数据结构,每个节点最多有两个子节点。通过文件名的字典序构建和查找二叉树,能高效地管理和检索文件。相较于顺序查找,二叉树查找每次比较可排除一半子树,极大提升了查找效率,尤其适用于海量文件管理。Python代码示例包括定义节点类、插入和查找函数,展示了如何快速定位目标文件。二叉树查找算法为文件管理系统的优化提供了有效途径。
47 5
|
2月前
|
算法
分享一些提高二叉树遍历算法效率的代码示例
这只是简单的示例代码,实际应用中可能还需要根据具体需求进行更多的优化和处理。你可以根据自己的需求对代码进行修改和扩展。
|
2月前
|
存储 缓存 算法
如何提高二叉树遍历算法的效率?
选择合适的遍历算法,如按层次遍历树时使用广度优先搜索(BFS),中序遍历二叉搜索树以获得有序序列。优化数据结构,如使用线索二叉树减少空指针判断,自定义节点类增加辅助信息。利用递归与非递归的特点,避免栈溢出问题。多线程并行遍历提高速度,注意线程安全。缓存中间结果,避免重复计算。预先计算并存储信息,提高遍历效率。综合运用这些方法,提高二叉树遍历算法的效率。
70 5
|
2月前
|
机器学习/深度学习 JSON 算法
二叉树遍历算法的应用场景有哪些?
【10月更文挑战第29天】二叉树遍历算法作为一种基础而重要的算法,在许多领域都有着不可或缺的应用,它为解决各种复杂的问题提供了有效的手段和思路。随着计算机科学的不断发展,二叉树遍历算法也在不断地被优化和扩展,以适应新的应用场景和需求。
61 0
|
3月前
|
存储 算法 关系型数据库
数据结构与算法学习二一:多路查找树、二叉树与B树、2-3树、B+树、B*树。(本章为了解基本知识即可,不做代码学习)
这篇文章主要介绍了多路查找树的基本概念,包括二叉树的局限性、多叉树的优化、B树及其变体(如2-3树、B+树、B*树)的特点和应用,旨在帮助读者理解这些数据结构在文件系统和数据库系统中的重要性和效率。
36 0
数据结构与算法学习二一:多路查找树、二叉树与B树、2-3树、B+树、B*树。(本章为了解基本知识即可,不做代码学习)
|
3月前
|
存储 算法 搜索推荐
数据结构与算法学习十七:顺序储存二叉树、线索化二叉树
这篇文章主要介绍了顺序存储二叉树和线索化二叉树的概念、特点、实现方式以及应用场景。
43 0
数据结构与算法学习十七:顺序储存二叉树、线索化二叉树