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 相关文章推荐
innertext , insertadjacentelement , insertadjacenthtml , insertadjacenttext 等区别
Jun 29 Javascript
angularjs 处理多个异步请求方法汇总
Jan 06 Javascript
js设置document.domain实现跨域的注意点分析
May 21 Javascript
js内置对象处理_打印学生成绩单的简单实现
Sep 24 Javascript
js中scrollTop()方法和scroll()方法用法示例
Oct 03 Javascript
jQuery联动日历的实例解析
Dec 02 Javascript
JavaScript中关于class的调用方法
Nov 28 Javascript
如何用input标签和jquery实现多图片的上传和回显功能
May 16 jQuery
Node.js中的child_process模块详解
Jun 08 Javascript
Layui选项卡制作历史浏览记录的方法
Sep 28 Javascript
vue键盘事件点击事件加native操作
Jul 27 Javascript
JS实现悬浮球只在一侧滑动并且是横屏状态下
Aug 19 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
overlord人气高涨,却被菲利普频繁举报,第四季很难在国内上映
2020/05/06 日漫
了解咖啡雨林联盟认证 什么是雨林认证 雨林认证是什么意思
2021/03/05 新手入门
PHP下操作Linux消息队列完成进程间通信的方法
2010/07/24 PHP
PHP中用正则表达式清除字符串的空白
2011/01/17 PHP
php cURL和Rolling cURL并发方式比较
2013/10/30 PHP
DIV菜单层实现代码
2010/11/19 Javascript
jquery实现excel导出的方法
2013/04/04 Javascript
JS 各种网页尺寸判断实例方法
2013/04/18 Javascript
document.documentElement的一些使用技巧
2013/04/18 Javascript
js获取指定日期前后的日期代码
2013/08/20 Javascript
js实例属性和原型属性示例详解
2014/11/23 Javascript
JavaScript动态修改背景颜色的方法
2015/04/16 Javascript
readonly和disabled属性的区别
2015/07/26 Javascript
window.setInterval()方法的定义和用法及offsetLeft与style.left的区别
2015/11/11 Javascript
动态创建按钮的JavaScript代码
2016/01/29 Javascript
第九章之路径分页标签与徽章组件
2016/04/25 Javascript
利用Jquery队列实现根据输入数量显示的动画
2016/09/01 Javascript
Vue ElementUI之Form表单验证遇到的问题
2017/08/21 Javascript
AngularJS中scope的绑定策略实例分析
2017/10/30 Javascript
Angular4集成ng2-file-upload的上传组件
2018/03/14 Javascript
JavaScript实现星级评价效果
2019/05/17 Javascript
Vue——解决报错 Computed property &quot;****&quot; was assigned to but it has no setter.
2020/12/19 Vue.js
Python处理文本文件中控制字符的方法
2017/02/07 Python
python跳出双层for循环的解决方法
2019/06/24 Python
python之生产者消费者模型实现详解
2019/07/27 Python
python中有帮助函数吗
2020/06/19 Python
关于Python3爬虫利器Appium的安装步骤
2020/07/29 Python
娇韵诗香港官网:Clarins香港
2020/08/13 全球购物
雅虎笔试题(字符串操作)
2015/03/24 面试题
法学研究生自我鉴定范文
2013/12/04 职场文书
面料业务员岗位职责
2013/12/26 职场文书
幼儿园家长会欢迎词
2014/01/09 职场文书
《为人民服务》教学反思
2016/02/20 职场文书
写好求职信的技巧解密
2019/05/14 职场文书
正确的理解和使用Django信号(Signals)
2021/04/14 Python
自定义函数实现单词排序并运用于PostgreSQL(实现代码)
2021/04/22 PostgreSQL