javascript实现二叉树遍历的代码

发布时间 - 2026-01-11 01:47:50    点击率:

前言:

紧接着上篇 二叉树的javascript实现 ,来说一下二叉树的遍历。

本次一本正经的胡说八道,以以下这个二叉树为例子进行遍历:

接着是要引入二叉树实现的代码:

function Node(data, left, right) {
  this.data = data;
  this.left = left;
  this.right = right;
  this.show = show;
}
function show() {
  return this.data;
}

function BST() {
  this.root = null;
  this.insert = insert;
}
function insert(data) {
  var n = new Node(data, null, null);
  if (this.root == null) {
   this.root = n;
  }
  else {
   var current = this.root;
   var parent;
   while (true) {
     parent = current;
     if (data < current.data) {
      current = current.left;
      if (current == null) {
        parent.left = n;
        break;
      }
     }
     else {
      current = current.right;
      if (current == null) {
        parent.right = n;
        break;
      }
     }
   }
  }
}

二叉树遍历的分类

二叉树的遍历分为先序、中序、后序遍历。这里说到的先序、中序、后序是相对于父节点来说。父节点的值先输出就是先序,三者间它在中间输出就是中序,最后输出就是后序。至于那个是父节点是相对而言的,因为除了叶子节点(最底下一层节点),其他每个节点都可以是父节点。

先序遍历

先序遍历就是,先打印父节点,然后是左子节点(左子树),然后再打印右子节点(子树)。

function preOrder(node) {
  if (!(node == null)) {
   console.log(node.show() + " ");
   preOrder(node.left);
   preOrder(node.right);
  }
}

// 给BST类添加先序遍历的成员方法
function BST() {
  this.root = null;
  this.insert = insert;
  this.preOrder = preOrder;
}

preOrder函数是递归实现的,应该说二叉树的遍历都是递归实现的。可能有些人会因为先序遍历的特征:“先打印父节点,然后是左子节点(左子树),然后再打印右子节点(子树)” 而陷入一个错误的想法,这想法是什么请看下图:

注意红框部分,父节点是10,左子节点是3,右子节点是18,因为上面的结论,可能会错误地认为打印的顺序是10 → 3 → 18,然而事实并非如此[捂脸],真是的顺序是:先打印10,然后是打印左子树,打印完左子树的全部节点后,才开始打印以10位父节点的右子树:

这个时候,你的脑海就该这样想:

然后是这样想:

如此类推打印完以10为父节点的左子树,然后也是以这样的方式打印以10为父节点的右子树,按着这种 拆分代替的思想 来理解会更好明白二叉树的遍历。

然后最终,先序遍历改二叉树的顺序是:

按图的输出顺序是:10 -> 3 -> 2 -> 4 -> 9 -> 8 -> 9 -> 18 -> 13 -> 21

最后来实践一下,先序遍历:

var bst = new BST();
var nums = [10, 3, 18, 2, 4, 13, 21, 9, 8, 9];
for(var i = 0; i < nums.length; i++) {
  bst.insert(nums[i]);
}
bst.preOrder(bst.root);

这里强调一下,输出顺序和插入顺序有关的,因为你插入顺序不同生成的二叉树也是不同的。有疑问的可以去 二叉树的javascript实现 细看一下,有比较明白的说明了二叉树,也可以实验一下:

中序遍历

看完先序遍历,已经可以类推到很多和中序、后序遍历相关的知识点。中序遍历的特征是:先打印左子树(左子节点),接着打印父节点,最后打印右子树(右子节点)。

function inOrder(node) {
  if (!(node == null)) {
   inOrder(node.left);
   console.log(node.show() + " ");
   inOrder(node.right);
  }
}

// 给BST类添加该成员方法
function BST() {
  this.root = null;
  this.insert = insert;
  this.preOrder = preOrder;
  this.inOrder = inOrder;
}

中序遍历的打印顺序:

按上图的输出顺序是:2 -> 3 -> 4 -> 8 -> 9 -> 9 -> 10 -> 13 -> 18 -> 21

接着是,实践一下中序遍历:

后序遍历

function postOrder(node) {
  if (!(node == null)) {
   postOrder(node.left);
   postOrder(node.right);
   console.log(node.show() + " ");
  }
}

// 给BST类添加该成员方法
function BST() {
  this.root = null;
  this.insert = insert;
  this.preOrder = preOrder;
  this.inOrder = inOrder;
  this.postOrder = postOrder;
}

后序遍历的打印顺序

按上图的输出顺序是:2 -> 8 -> 9 -> 9 -> 4 -> 3 -> 13 -> 21 -> 18  -> 10

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


# javascript实现二叉树遍历  # javascript二叉树遍历  # JS  # 二叉树遍历  # 利用JS实现二叉树遍历算法实例代码  # JavaScript数据结构与算法之二叉树遍历算法详解【先序、中序、后序】  # JS中的二叉树遍历详解  # javaScript遍历对象和数组的方法总结  # JavaScript遍历json对象数据的方法  # JavaScript实现二叉树层序遍历  # 遍历  # 子树  # 二叉树  # 递归  # 然后再  # 为先  # 为父  # 都是  # 按上  # 的说  # 是这样  # 为你  # 说到  # 一本  # 看完  # 并非如此  # 这个时候  # 人会  # 应该说  # 它在 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251811 】 【 AI营销90571


相关推荐: Laravel怎么发送邮件_Laravel Mail类SMTP配置教程  浅谈javascript alert和confirm的美化  html文件怎么打开证书错误_https协议的html打开提示不安全【指南】  javascript中的try catch异常捕获机制用法分析  Python自然语言搜索引擎项目教程_倒排索引查询优化案例  javascript中对象的定义、使用以及对象和原型链操作小结  家族网站制作贴纸教程视频,用豆子做粘帖画怎么制作?  三星、SK海力士获美批准:可向中国出口芯片制造设备  Laravel怎么在Blade中安全地输出原始HTML内容  Win10如何卸载预装Edge扩展_Win10卸载Edge扩展教程【方法】  微信小程序 wx.uploadFile无法上传解决办法  如何挑选优质建站一级代理提升网站排名?  如何获取PHP WAP自助建站系统源码?  Windows10如何更改计算机工作组_Win10系统属性修改Workgroup  Laravel如何创建自定义Artisan命令?(代码示例)  Laravel如何处理JSON字段的查询和更新_Laravel JSON列操作与查询技巧  Firefox Developer Edition开发者版本入口  Android自定义控件实现温度旋转按钮效果  在线ppt制作网站有哪些软件,如何把网页的内容做成ppt?  百度输入法ai组件怎么删除 百度输入法ai组件移除工具  Python结构化数据采集_字段抽取解析【教程】  如何在建站主机中优化服务器配置?  php中::能调用final静态方法吗_final修饰静态方法调用规则【解答】  🚀拖拽式CMS建站能否实现高效与个性化并存?  IOS倒计时设置UIButton标题title的抖动问题  Win11应用商店下载慢怎么办 Win11更改DNS提速下载【修复】  如何挑选最适合建站的高性能VPS主机?  Laravel如何实现全文搜索_Laravel Scout集成Algolia或Meilisearch教程  详解MySQL数据库的安装与密码配置  香港服务器建站指南:外贸独立站搭建与跨境电商配置流程  Laravel如何实现多对多模型关联?(Eloquent教程)  Claude怎样写结构化提示词_Claude结构化提示词写法【教程】  Laravel模型关联查询教程_Laravel Eloquent一对多关联写法  Laravel如何使用Blade模板引擎?(完整语法和示例)  今日头条AI怎样推荐抢票工具_今日头条AI抢票工具推荐算法与筛选【技巧】  JavaScript中如何操作剪贴板_ClipboardAPI怎么用  西安市网站制作公司,哪个相亲网站比较好?西安比较好的相亲网站?  Laravel怎么进行浏览器测试_Laravel Dusk自动化浏览器测试入门  如何在 Python 中将列表项按字母顺序编号(a.、b.、c. …)  VIVO手机上del键无效OnKeyListener不响应的原因及解决方法  JS实现鼠标移上去显示图片或微信二维码  微信h5制作网站有哪些,免费微信H5页面制作工具?  Android利用动画实现背景逐渐变暗  如何在HTML表单中获取用户输入并用JavaScript动态控制复利计算循环  phpredis提高消息队列的实时性方法(推荐)  如何快速重置建站主机并恢复默认配置?  Laravel中Service Container是做什么的_Laravel服务容器与依赖注入核心概念解析  如何用JavaScript实现文本编辑器_光标和选区怎么处理  Laravel用户密码怎么加密_Laravel Hash门面使用教程  移动端脚本框架Hammer.js