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 相关文章推荐
了解jQuery技巧来提高你的代码
Jan 08 Javascript
jQuery操作 input type=checkbox的实现代码
Jun 14 Javascript
window.open 以post方式传递参数示例代码
Feb 27 Javascript
BootStrap中Datepicker控件带中文的js文件
Aug 10 Javascript
windows下vue.js开发环境搭建教程
Mar 20 Javascript
Angular.js自动化测试之protractor详解
Jul 07 Javascript
Vue仿手机qq的实例代码(demo)
Sep 08 Javascript
Vue 中的compile操作方法
Feb 26 Javascript
vue打包的时候自动将px转成rem的操作方法
Jun 20 Javascript
解决angular2 获取到的数据无法实时更新的问题
Aug 31 Javascript
vue-cli项目代理proxyTable配置exclude的方法
Sep 20 Javascript
微信小程序 image组件遇到的问题
May 28 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 - Html Transfer Code
2006/10/09 PHP
php视频拍照上传头像功能实现代码分享
2015/10/08 PHP
PHP使用星号替代用户名手机和邮箱的实现代码
2018/02/07 PHP
javascript HTMLEncode HTMLDecode的完整实例(兼容ie和火狐)
2009/06/02 Javascript
javascript 操作select下拉列表框的一点小经验
2010/03/20 Javascript
location对象的属性和方法应用(解析URL)
2013/04/12 Javascript
js使用for循环与innerHTML获取选中tr下td值
2014/09/26 Javascript
Javascript基础教程之数据类型 (数值 Number)
2015/01/18 Javascript
js实现背景图片感应鼠标变化的方法
2015/02/28 Javascript
javascript实现自动输出文本(打字特效)
2015/08/27 Javascript
jquery淡入淡出效果简单实例
2016/01/14 Javascript
react-router4按需加载(踩坑填坑)
2019/01/06 Javascript
vue-cli webpack配置文件分析
2019/05/20 Javascript
小程序如何定位所在城市及发起周边搜索
2020/02/11 Javascript
解决vue数据不实时更新的问题(数据更改了,但数据不实时更新)
2020/10/27 Javascript
[52:20]VP vs VG Supermajor小组赛 B组胜者组决赛 BO3 第一场 6.2
2018/06/03 DOTA
[01:17:55]VGJ.T vs Mineski 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/20 DOTA
[38:31]完美世界DOTA2联赛PWL S3 Magma vs GXR 第一场 12.13
2020/12/17 DOTA
[01:07:20]DOTA2-DPC中国联赛 正赛 Dynasty vs XG BO3 第二场 2月2日
2021/03/11 DOTA
如何运行Python程序的方法
2013/04/21 Python
python实现获取客户机上指定文件并传输到服务器的方法
2015/03/16 Python
python结合opencv实现人脸检测与跟踪
2015/06/08 Python
python中使用正则表达式的后向搜索肯定模式(推荐)
2017/11/11 Python
TensorFlow中权重的随机初始化的方法
2018/02/11 Python
Python批量合并有合并单元格的Excel文件详解
2018/04/05 Python
python 自定义异常和异常捕捉的方法
2018/10/18 Python
Python 学习教程之networkx
2019/04/15 Python
3种python调用其他脚本的方法
2020/01/06 Python
详解用python -m http.server搭一个简易的本地局域网
2020/09/24 Python
美国专业汽车音响和移动电子产品零售商:Car Toys
2019/05/13 全球购物
线程同步的方法
2016/11/23 面试题
物业管理毕业生的自我评价
2014/02/17 职场文书
党组织公开承诺书
2014/03/29 职场文书
世界气象日活动总结
2015/02/27 职场文书
《折线统计图》教学反思
2016/02/22 职场文书
一文了解JavaScript用Element Traversal新属性遍历子元素
2021/11/27 Javascript