JS实现的二叉树算法完整实例
发布时间 - 2026-01-11 00:31:52 点击率:次本文实例讲述了JS实现的二叉树算法。分享给大家供大家参考,具体如下:
<!DOCTYPE HTML>
<head>
<title>20130328BinaryTree</title>
<metahttp-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>
<html>
<body>
<script>
//今天学习了下二叉树算法,总结在这里
//1全局变量 binary Tree =bt
//1.1 node
function Node() { //bt节点
this.text = ''; //节点的文本
this.leftChild = null; //节点的左孩子引用
this.rightild = null; //节点右孩子引用
}
//1.2 二叉树装载的字符串
var strText = "";
var charecters = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'];
var len = charecters.length ; //数组的长度
var nodes = new Array(); //创建一个临时数组,用于存放二叉树节点
//循环创建二叉树节点存放到数组中
for (var i = 0 ; i < len ; i++) {
var node = new Node();
node.text = charecters[i];
nodes.push(node);
}
var root = nodes[0];
//1.3 栈
function Stack() {
var stack = new Array(); //存放栈的数组
//压栈
this.push = function(o) {
stack.push(o);
};
//出栈
this.pop = function() {
var o = stack[stack.length-1];
stack.splice(stack.length-1, 1);
return o;
};
//检查栈是否为空
this.isEmpty = function() {
if(stack.length <= 0) {
return true;
}
else {
return false;
}
};
}
//使用方式如下
var stack = new Stack();
stack.push(1); //现在栈中有一个元素
stack.isEmpty(); //false , 栈不为空
//alert(stack.pop()); //出栈, 打印1
stack.isEmpty(); //true, 此时栈为空,因为在调用了stack.pop()之后元素出栈了,所以为空
//2.1递归实现:
function buildBt1(node, i) {
var leftIndex = 2*i+1, //左孩子节点的索引
rightIndex = 2*i+2; //右孩子节点的索引
if(leftIndex < charecters.length) { //判断索引的长度是否超过了charecters数组的大小
var childNode = new Node(); //创建一个新的节点对象
childNode.text = charecters[leftIndex]; //给节点赋值
node.leftChild = childNode; //给当前节点node加入左孩子节点
buildBt1(childNode, leftIndex); //递归创建左孩子
}
if(rightIndex < charecters.length) { //同上
var childNode = new Node();
childNode.text = charecters[rightIndex];
node.rightChild = childNode;
buildBt1(childNode, rightIndex);
}
}
//2.2非递归实现
function buildBt2() {
index = 0; //索引从0开始
//循环建立二叉树子节点的引用
while(index < len) {
var leftIndex = 2*index+1, //当前节点左孩子索引
rightIndex = 2*index+2; //当前节点右孩子索引
//给当前节点添加左孩子
nodes[index].leftChild = nodes[leftIndex];
//给当前节点添加右孩子
nodes[index].rightChild = nodes[rightIndex];
index++;
}
}
//3遍历
//3.1.1先序递归遍历
function firstIteration(node) {
if(node.leftChild) { //判断当前节点是否有左孩子
firstIteration(node.leftChild); //递归左孩子
}
if(node.rightChild) { //判断当前节点是否有右孩子
firstIteration(node.rightChild); //递归右孩子
}
}
//递归遍历二叉树
firstIteration(root);
//3.1.2先序普通遍历
function notFirstIteration(node) {
var stack = new Stack(), //开辟一个新的栈对象
resultText = ''; //存放非递归遍历之后的字母顺序
stack.push(root); //这个root在上面非递归方式构建二叉树的时候已经构建好的
var node = root;
resultText += node.text;
while(!stack.isEmpty()) {
while(node.leftChild) { //判断当前节点是否有左孩子节点
node = node.leftChild; //取当前节点的左孩子节点
resultText += node.text; //访问当前节点
stack.push(node); //将当前节点压入栈中
}
stack.pop(); //出栈
node = stack.pop().rightChild; //访问当前节点的兄弟节点(右孩子节点)
if(node) { //当前节点的兄弟节点不为空
resultText += node.text; //访问当前节点
stack.push(node); //将当前节点压入栈中
}
else { //当前节点的兄弟节点为空
node = stack.pop(); //在回溯到上一层
}
}
}
//非递归先序遍历
// notFirstIteration(root);
//3.2.1中序递归遍历
function btIteration21(node) {
//访问左节点
if(node.leftChild) {
if(node.leftChild.leftChild) {
btIteration21(node.leftChild);
}
else {
strText += node.leftChild.text;
}
}
//访问根节点
strText += node.text;
//访问右节点
if(node.rightChild) {
if(node.rightChild.leftChild) {
btIteration21(node.rightChild);
}
else {
strText += node.rightChild.text;
}
}
}
//测试区
//2.1.1测试递归实现
var node = new Node();
node.text = charecters[0];
buildBt1(node, 0); //索引i是从0开始构建
btIteration21(node);
alert(strText);
</script>
</body>
</html>
更多关于JavaScript相关内容感兴趣的读者可查看本站专题:《JavaScript数据结构与算法技巧总结》、《JavaScript数学运算用法总结》、《JavaScript排序算法总结》、《JavaScript遍历算法与技巧总结》、《JavaScript查找算法技巧总结》及《JavaScript错误与调试技巧总结》
希望本文所述对大家JavaScript程序设计有所帮助。
# JS
# 二叉树
# 算法
# JS实现二叉查找树的建立以及一些遍历方法实现
# JavaScript数据结构之二叉查找树的定义与表示方法
# JavaScript数据结构与算法之二叉树实现查找最小值、最大值、给定值算法示例
# JavaScript实现二叉树定义、遍历及查找的方法详解
# JavaScript数据结构之二叉树的查找算法示例
# JavaScript实现二叉树的先序、中序及后序遍历方法详解
# javascript实现二叉树遍历的代码
# Javascript实现从小到大的数组转换成二叉搜索树
# JavaScript数据结构之二叉树的删除算法示例
# JavaScript实现的DOM树遍历方法详解【二叉DOM树、多叉DOM树】
# JavaScript数据结构之二叉树的遍历算法示例
# JS中的算法与数据结构之二叉查找树(Binary Sort Tree)实例详解
# 递归
# 遍历
# 为空
# 创建一个
# 在这里
# 相关内容
# 中有
# 是从
# 感兴趣
# 数据结构
# 给大家
# 在上面
# 更多关于
# 所述
# 程序设计
# 上一层
# 组中
# 全局变量
# 超过了
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
高性能网站服务器配置指南:安全稳定与高效建站核心方案
北京网站制作公司哪家好一点,北京租房网站有哪些?
网站建设要注意的标准 促进网站用户好感度!
Laravel如何使用Guzzle调用外部接口_Laravel发起HTTP请求与JSON数据解析【详解】
香港代理服务器配置指南:高匿IP选择、跨境加速与SEO优化技巧
Laravel如何使用Facades(门面)及其工作原理_Laravel门面模式与底层机制
高端云建站费用究竟需要多少预算?
PHP 实现电台节目表的智能时间匹配与今日/明日轮播逻辑
高防服务器租用首荐平台,企业级优惠套餐快速部署
如何打造高效商业网站?建站目的决定转化率
Laravel如何设置自定义的日志文件名_Laravel根据日期或用户ID生成动态日志【技巧】
Laravel如何使用模型观察者?(Observer代码示例)
Laravel Livewire是什么_使用Laravel Livewire构建动态前端界面
如何在建站之星绑定自定义域名?
Laravel如何处理和验证JSON类型的数据库字段
html5如何设置样式_HTML5样式设置方法与CSS应用技巧【教程】
新三国志曹操传主线渭水交兵攻略
Laravel中的Facade(门面)到底是什么原理
如何在新浪SAE免费搭建个人博客?
javascript基于原型链的继承及call和apply函数用法分析
如何快速查询网站的真实建站时间?
JavaScript模板引擎Template.js使用详解
用yum安装MySQLdb模块的步骤方法
宙斯浏览器文件分类查看教程 快速筛选视频文档与图片方法
如何在景安云服务器上绑定域名并配置虚拟主机?
Java Adapter 适配器模式(类适配器,对象适配器)优缺点对比
如何做网站制作流程,*游戏网站怎么搭建?
DeepSeek是免费使用的吗 DeepSeek收费模式与Pro版本功能详解
Laravel Blade模板引擎语法_Laravel Blade布局继承用法
重庆市网站制作公司,重庆招聘网站哪个好?
Laravel如何部署到服务器_线上部署Laravel项目的完整流程与步骤
图片制作网站免费软件,有没有免费的网站或软件可以将图片批量转为A4大小的pdf?
Laravel Vite是做什么的_Laravel前端资源打包工具Vite配置与使用
微信小程序 HTTPS报错整理常见问题及解决方案
Laravel如何从数据库删除数据_Laravel destroy和delete方法区别
JavaScript如何操作视频_媒体API怎么控制播放
Linux后台任务运行方法_nohup与&使用技巧【技巧】
公司门户网站制作公司有哪些,怎样使用wordpress制作一个企业网站?
在线ppt制作网站有哪些软件,如何把网页的内容做成ppt?
Laravel怎么配置S3云存储驱动_Laravel集成阿里云OSS或AWS S3存储桶【教程】
Laravel如何实现全文搜索功能?(Scout和Algolia示例)
Laravel如何使用Gate和Policy进行授权?(权限控制)
javascript如何操作浏览器历史记录_怎样实现无刷新导航
微信小程序 require机制详解及实例代码
如何在万网利用已有域名快速建站?
免费制作统计图的网站有哪些,如何看待现如今年轻人买房难的情况?
Windows家庭版如何开启组策略(gpedit.msc)?(安装方法)
Laravel怎么创建自己的包(Package)_Laravel扩展包开发入门到发布
实例解析Array和String方法
Win11怎样安装网易有道词典_Win11安装词典教程【步骤】

