javascript实现二叉树的代码

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

前言:

二叉树的特点(例图只是二叉树的一种情况,不要尝试用例图推理以下结论)

  1. 除了最下面一层,每个节点都是父节点,每个节点都有且最多有两个子节点;
  2. 除了嘴上面一层,每个节点是子节点,每个节点都会有一个父节点;
  3. 最上面一层的节点(即例图中的节点50)为根节点;

最下面一层的节点称为叶子节点,他们没有子节点;

左子节点的值 < 父节点的值 <= 右节点的值

1 节点的javascript实现

// 节点对象
function Node(data, left, right) {
  this.data = data; // 节点值
  this.left = left; // 当前节点的左子节点
  this.right = right; // 当前节点的右子节点
  this.show = show; // 辅助function
}

function show() {
  return this.data;
}

感受下上面实现节点的代码,感觉和链表有点相似不是吗,存着当前值,又存着下个节点(左、右子节点)的引用,下面是一张伪代码的草图:

2 二叉树的实现

实现二叉树,当然就是要插入节点构成二叉树,先看看实现二叉树的js代码

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 BST() {
  this.root = null; // 根节点
  this.insert = insert;
}

function insert(data) {
  // 初始化一个节点,为什么要将左右子节点的引用初始化为空呢,因为可能是叶子节点,加入他有子节点,会在下面的代码添加
  var n = new Node(data, null, null);
  if (该二叉树是否为空,是空则根节点为空,因此可以用根节点判断二叉树是否为空) {
   // 将当前节点存为根节点
   this.root = n;
  }
  else {
   // 来到这里就表示,该二叉树不为空,这里关键的是两句代码:
   // 0.while (true);
   // 1.parent = current;
   // 2.current = current.left;/current = current.right;
   // 3.break;
   var current = this.root;
   var parent;
   while (true) {
     parent = current; // 获得父节点,第一次循环,那么父节点就是根节点
     if (data < current.data) { // 当前节点值小于父节点的值就是存左边,记得二叉树的特点吧,如果真是小于父节点,那么就说明该节点属于,该父节点的左子树。
      current = current.left;
      if (current == null) {
        parent.left = n;
        break;
      }

      // 其实上面这样写不好理解,可以等价于下面的代码:
      // start
      if(current.left == null){ // 若果左节点空,那么这个空的节点就是我们要插入的位置
        current.left = n;
        break;
      }else{
        // 不空则继续往下一层找空节点(插入的位置)
        current = current.left;
      }
      // end
     }
     else {
      // 右节点的逻辑代码个左节点的一样的
      current = current.right;
      if (current == null) {
        parent.right = n;
        break;
      }
     }
   }
  }
}

下面是一个更好理解的插入函数

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

小结:

二叉树的实现的三个部件

Node对象

function Node(data, left, right) { ... }

BST对象

function BST() { ... }

插入节点函数

function insert(data) { ... }

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


# javascript实现二叉树  # javascript  # 二叉树  # js二叉树的实现  # JS中的二叉树遍历详解  # JS实现的二叉树算法完整实例  # JavaScript数据结构和算法之二叉树详解  # JS二叉树的简单实现方法示例  # JavaScript实现二叉树的先序、中序及后序遍历方法详解  # javascript实现二叉树遍历的代码  # JavaScript数据结构之二叉树的删除算法示例  # JavaScript数据结构之二叉树的遍历算法示例  # JavaScript数据结构之二叉树的查找算法示例  # js构建二叉树进行数值数组的去重与优化详解  # 为空  # 子树  # 的是  # 都是  # 是一个  # 都有  # 最多  # 可以用  # 会在  # 他有  # 两句  # 要将  # 看一下  # 往下  # 嘴上  # 下个  # 图中  # 大家多多  # 点吧 


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


相关推荐: 如何选择可靠的免备案建站服务器?  免费网站制作appp,免费制作app哪个平台好?  Laravel数据库迁移怎么用_Laravel Migration管理数据库结构的正确姿势  jQuery中的100个技巧汇总  如何在宝塔面板创建新站点?  如何使用 jQuery 正确渲染 Instagram 风格的标签列表  再谈Python中的字符串与字符编码(推荐)  济南网站建设制作公司,室内设计网站一般都有哪些功能?  JS中使用new Date(str)创建时间对象不兼容firefox和ie的解决方法(两种)  Laravel如何升级到最新的版本_Laravel版本升级流程与兼容性处理  如何在建站之星绑定自定义域名?  Laravel怎么使用artisan命令缓存配置和视图  昵图网官网入口 昵图网素材平台官方入口  高防服务器如何保障网站安全无虞?  JavaScript如何实现类型判断_typeof和instanceof有什么区别  如何解决hover在ie6中的兼容性问题  如何获取上海专业网站定制建站电话?  电视网站制作tvbox接口,云海电视怎样自定义添加电视源?  如何确保FTP站点访问权限与数据传输安全?  品牌网站制作公司有哪些,买正品品牌一般去哪个网站买?  新三国志曹操传主线渭水交兵攻略  网页制作模板网站推荐,网页设计海报之类的素材哪里好?  html5audio标签播放结束怎么触发事件_onended回调方法【教程】  Laravel API资源类怎么用_Laravel API Resource数据转换  如何在阿里云完成域名注册与建站?  详解Android——蓝牙技术 带你实现终端间数据传输  android nfc常用标签读取总结  Laravel如何获取当前登录用户信息_Laravel Auth门面使用与Session用户读取【技巧】  历史网站制作软件,华为如何找回被删除的网站?  jimdo怎样用html5做选项卡_jimdo选项卡html5实现与切换效果【指南】  Laravel Docker环境搭建教程_Laravel Sail使用指南  Laravel如何配置任务调度?(Cron Job示例)  Laravel表单请求验证类怎么用_Laravel Form Request分离验证逻辑教程  Laravel全局作用域是什么_Laravel Eloquent Global Scopes应用指南  桂林网站制作公司有哪些,桂林马拉松怎么报名?  谷歌Google入口永久地址_Google搜索引擎官网首页永久入口  nodejs redis 发布订阅机制封装实现方法及实例代码  Laravel如何使用Blade模板引擎?(完整语法和示例)  Laravel观察者模式如何使用_Laravel Model Observer配置  Laravel如何构建RESTful API_Laravel标准化API接口开发指南  VIVO手机上del键无效OnKeyListener不响应的原因及解决方法  如何在IIS7中新建站点?详细步骤解析  Laravel控制器是什么_Laravel MVC架构中Controller的作用与实践  Laravel如何实现本地化和多语言支持?(i18n教程)  Laravel Vite是做什么的_Laravel前端资源打包工具Vite配置与使用  电商网站制作价格怎么算,网上拍卖流程以及规则?  如何利用DOS批处理实现定时关机操作详解  Laravel Telescope怎么调试_使用Laravel Telescope进行应用监控与调试  标题:Vue + Vuex 项目中正确使用 JWT 进行身份认证的实践指南  如何做网站制作流程,*游戏网站怎么搭建?