javascript实现二叉树的代码


Posted in Javascript onJune 08, 2017

前言:

javascript实现二叉树的代码

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

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

javascript实现二叉树的代码

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

javascript实现二叉树的代码

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

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;
}

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

javascript实现二叉树的代码

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实现的UBB编码函数
Mar 09 Javascript
基于JQuery的模拟苹果桌面Dock效果(稳定版)
Oct 15 Javascript
JavaScript打印iframe内容示例代码
Aug 20 Javascript
JavaScript 实现打印,打印预览,打印设置
Dec 30 Javascript
Javascript基础教程之比较操作符
Jan 18 Javascript
DOM基础教程之使用DOM
Jan 19 Javascript
JQuery实现网页右侧随动广告特效
Jan 17 Javascript
node.js入门教程之querystring模块的使用方法
Feb 27 Javascript
jQuery+Datatables实现表格批量删除功能【推荐】
Oct 24 jQuery
通过js给网页加上水印背景实例
Jun 17 Javascript
解析JS在获取当前月的最后一天遇到的坑
Aug 30 Javascript
浅谈nuxtjs校验登录中间件和混入(mixin)
Nov 06 Javascript
微信小程序搜索组件wxSearch实例详解
Jun 08 #Javascript
JS去掉字符串前后空格、阻止表单提交的实现代码
Jun 08 #Javascript
angular实现图片懒加载实例代码
Jun 08 #Javascript
微信小程序日历组件calendar详解及实例
Jun 08 #Javascript
php简单数据库操作类的封装
Jun 08 #Javascript
ReactJs设置css样式的方法
Jun 08 #Javascript
requirejs按需加载angularjs文件实例
Jun 08 #Javascript
You might like
如何在PHP程序中防止盗链
2008/04/09 PHP
编写漂亮的代码 - 将后台程序与前端程序分开
2008/04/23 PHP
40个迹象表明你还是PHP菜鸟
2008/09/29 PHP
Yii 使用intervention/image拓展实现图像处理功能
2019/06/22 PHP
js中的escape及unescape函数的php实现代码
2007/09/04 Javascript
初步认识JavaScript函数库jQuery
2015/06/18 Javascript
JavaScript reduce和reduceRight详解
2016/10/24 Javascript
JavaScript判断浏览器及其版本信息
2017/01/20 Javascript
JavaScript编写九九乘法表(两种任选)
2017/02/04 Javascript
微信小程序组件之srcoll-view的详解
2017/10/19 Javascript
Angular2开发环境搭建教程之VS Code
2017/12/15 Javascript
vue计算属性computed、事件、监听器watch的使用讲解
2019/01/21 Javascript
如何检查一个对象是否为空
2019/04/11 Javascript
vue利用全局导航守卫作登录后跳转到未登录前指定页面的实例代码
2020/05/19 Javascript
小程序表单认证布局及验证详解
2020/06/19 Javascript
微信小程序实现倒计时功能
2020/11/19 Javascript
Python脚本实现集群检测和管理功能
2015/03/06 Python
Swift 3.0在集合类数据结构上的一些新变化总结
2016/07/11 Python
python2与python3的print及字符串格式化小结
2018/11/30 Python
详解python的argpare和click模块小结
2019/03/31 Python
在Django下创建项目以及设置settings.py教程
2019/12/03 Python
解决tensorflow/keras时出现数组维度不匹配问题
2020/06/29 Python
python 利用zmail库发送邮件
2020/09/11 Python
python+selenium实现12306模拟登录的步骤
2021/01/21 Python
CSS3 开发工具收集
2010/04/17 HTML / CSS
详解Html5原生拖拽操作
2018/01/12 HTML / CSS
美国正宗奢华复古手袋、珠宝及配饰网站:What Goes Around Comes Around
2018/07/21 全球购物
学生安全责任书模板
2014/07/25 职场文书
英文感谢信格式
2015/01/21 职场文书
博士给导师的自荐信
2015/03/06 职场文书
2015年119消防宣传日活动总结
2015/03/24 职场文书
2015年社区创卫工作总结
2015/04/21 职场文书
幼儿园托班开学寄语(2016春季)
2015/12/03 职场文书
竞选稿之小学班干部
2019/10/31 职场文书
Python使用psutil库对系统数据进行采集监控的方法
2021/08/23 Python
MySQL数据库 任意ip连接方法
2022/05/20 MySQL