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 相关文章推荐
Tinymce+jQuery.Validation使用产生的BUG
Mar 29 Javascript
jquery定时滑出可最小化的底部提示层特效代码
Oct 02 Javascript
使用原生js写的一个简单slider
Apr 29 Javascript
JavaScript中使用document.write向页面输出内容实例
Oct 16 Javascript
原生javascript实现简单的datagrid数据表格
Jan 02 Javascript
AngularJS基础学习笔记之表达式
May 10 Javascript
jQuery File Upload文件上传插件使用详解
Dec 06 Javascript
详解Angualr 组件间通信
Jan 21 Javascript
vue + elementUI实现省市县三级联动的方法示例
Oct 29 Javascript
vue props 单项数据流实例分享
Feb 16 Javascript
Vue常用API、高级API的相关总结
Feb 02 Vue.js
vue实现无缝轮播效果(跑马灯)
May 14 Vue.js
微信小程序搜索组件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+.htaccess实现全站静态HTML文件GZIP压缩传输(一)
2007/02/15 PHP
php中的Base62类(适用于数值转字符串)
2013/08/12 PHP
Laravel 使用查询构造器配合原生sql语句查询的例子
2019/10/12 PHP
解决laravel(5.5)访问public报错的问题
2019/10/12 PHP
出现“不能执行已释放的Script代码”错误的原因及解决办法
2007/08/29 Javascript
jquery 多级下拉菜单核心代码
2010/05/21 Javascript
AngularJS入门教程(零):引导程序
2014/12/06 Javascript
js如何判断输入字符串长度
2015/12/16 Javascript
js实现图片上传并正常显示
2015/12/19 Javascript
鼠标悬停小图标显示大图标
2016/01/22 Javascript
早该知道的7个JavaScript技巧
2016/06/21 Javascript
weex里Vuex state使用storage持久化详解
2017/09/09 Javascript
Redux 和 Mobx的选择问题:让你不再困惑!
2017/09/18 Javascript
详解在vue-cli项目中使用mockjs(请求数据删除数据)
2017/10/23 Javascript
纯js代码生成可搜索选择下拉列表的实例
2018/01/11 Javascript
nodeJs实现基于连接池连接mysql的方法示例
2018/02/10 NodeJs
Vue中v-for的数据分组实例
2018/03/07 Javascript
基于vue实现可搜索下拉框定制组件
2020/03/26 Javascript
js 实现 list转换成tree的方法示例(数组到树)
2019/08/18 Javascript
[01:32]DOTA2次级联赛——首支职业女子战队选拔赛全记录
2014/10/23 DOTA
[44:09]DOTA2上海特级锦标赛A组小组赛#1 EHOME VS MVP.Phx第二局
2016/02/25 DOTA
tornado捕获和处理404错误的方法
2014/02/26 Python
python 安装virtualenv和virtualenvwrapper的方法
2017/01/13 Python
Python 找到列表中满足某些条件的元素方法
2018/06/26 Python
python单线程下实现多个socket并发过程详解
2019/07/27 Python
Python 仅获取响应头, 不获取实体的实例
2019/08/21 Python
Python unittest框架操作实例解析
2020/04/13 Python
HTML5页面无缝闪开的问题及解决方案
2020/06/11 HTML / CSS
allbeauty美国:英国在线美容店
2019/03/11 全球购物
班级活动策划书
2014/02/06 职场文书
2015元旦晚会主持人开场白+结束语
2014/12/14 职场文书
小石潭记导游词
2015/02/03 职场文书
交通事故起诉书
2015/05/19 职场文书
文明礼貌主题班会
2015/08/14 职场文书
2016年中学法制宣传日活动总结
2016/04/01 职场文书
Spring实现内置监听器
2021/07/09 Java/Android