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(JS) 压缩 / 混淆 / 格式化 批处理工具
Dec 10 Javascript
javascript使用中为什么10..toString()正常而10.toString()出错呢
Jan 11 Javascript
JS实现的用来对比两个用指定分隔符分割的字符串是否相同
Sep 19 Javascript
js实现简单的可切换选项卡效果
Apr 10 Javascript
javascript实现支持移动设备画廊
Aug 24 Javascript
js实现常用排序算法
Aug 09 Javascript
微信小程序中使元素占满整个屏幕高度实现方法
Dec 14 Javascript
jQuery幻灯片插件owlcarousel参数说明中文文档
Feb 27 jQuery
vue微信分享的实现(在当前页面分享其他页面)
Apr 16 Javascript
javascript中undefined的本质解析
Jul 31 Javascript
Vue的生命周期操作示例
Sep 17 Javascript
jquery实现直播视频弹幕效果
Feb 25 jQuery
微信小程序搜索组件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中通过数组进行高效随机抽取指定条记录的算法
2013/09/09 PHP
php数组删除元素示例
2014/03/21 PHP
PHP错误机制知识汇总
2016/03/24 PHP
php登录超时检测功能实例详解
2017/03/21 PHP
php数据库的增删改查 php与javascript之间的交互
2017/08/31 PHP
JS格式化数字保留两位小数点示例代码
2013/10/15 Javascript
jquery中get和post的简单实例
2014/02/04 Javascript
JavaScript实现点击按钮就复制当前网址
2015/12/14 Javascript
将angular.js项目整合到.net mvc中的方法详解
2017/06/29 Javascript
JS中使用gulp实现压缩文件及浏览器热加载功能
2017/07/12 Javascript
javascript 中select框触发事件过程的分析
2017/08/01 Javascript
jQuery仿移动端支付宝键盘的实现代码
2018/08/15 jQuery
微信小程序开发之tabbar图标和颜色的实现
2018/10/17 Javascript
vue.draggable实现表格拖拽排序效果
2018/12/01 Javascript
antd组件Upload实现自己上传的实现示例
2018/12/18 Javascript
微信小程序去除左上角返回键的实现方法
2020/03/06 Javascript
[12:36]《DOTA2》国服注册与激活指南全攻略
2013/04/28 DOTA
在windows系统中实现python3安装lxml
2016/03/23 Python
python+requests+unittest API接口测试实例(详解)
2017/06/10 Python
Python内置模块logging用法实例分析
2018/02/12 Python
Python爬取商家联系电话以及各种数据的方法
2018/11/10 Python
python利用7z批量解压rar的实现
2019/08/07 Python
Python Serial串口基本操作(收发数据)
2020/11/06 Python
Python爬取你好李焕英豆瓣短评生成词云的示例代码
2021/02/24 Python
python如何发送带有附件、正文为HTML的邮件
2021/02/27 Python
HTML5到底会有什么发展?HTML5的前景展望
2015/07/07 HTML / CSS
Html5踩坑记之mandMobile使用小记
2020/04/02 HTML / CSS
新加坡鲜花速递/新加坡网上花店:Ferns N Petals
2020/08/29 全球购物
投标承诺书怎么写
2014/05/24 职场文书
计算机专业毕业生自荐书
2014/06/02 职场文书
国际贸易毕业生求职信
2014/07/20 职场文书
交通事故起诉书
2015/05/19 职场文书
竞聘书的秘诀
2019/04/02 职场文书
处世之道:关于真诚相待的名言推荐
2019/12/02 职场文书
Python中Schedule模块使用详解 周期任务神器
2022/04/19 Python
numpy array找出符合条件的数并赋值的示例代码
2022/06/01 Python