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 prev ~ siblings选择器使用介绍
Aug 09 Javascript
用javascript读取xml文件读取节点数据
Aug 12 Javascript
JS实现从顶部下拉显示的带动画QQ客服特效代码
Oct 24 Javascript
Javascript编程之继承实例汇总
Nov 28 Javascript
BootStrap智能表单实战系列(八)表单配置json详解
Jun 13 Javascript
Bootstrap源码解读按钮(5)
Dec 23 Javascript
uploader秒传图片到服务器完整代码
Apr 22 Javascript
微信小程序表单弹窗实例
Jul 19 Javascript
Vue 中axios配置实例详解
Jul 27 Javascript
vue.js提交按钮时进行简单的if判断表达式详解
Aug 08 Javascript
JS实现获取自定义属性data值的方法示例
Dec 19 Javascript
JS实现省市县三级下拉联动
Apr 10 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
收音机鉴频器对声音的影响和频偏分析
2021/03/02 无线电
php中关于codeigniter的xmlrpc的类在进行数据交换时的类型问题
2011/07/03 PHP
分享一个超好用的php header下载函数
2014/01/31 PHP
PHP使用array_fill定义多维数组的方法
2015/03/18 PHP
PHP如何实现阿里云短信sdk灵活应用在项目中的方法
2019/06/14 PHP
javascript 面向对象编程 聊聊对象的事
2009/09/17 Javascript
JS 非图片动态loading效果实现代码
2010/04/09 Javascript
javascript 全选与全取消功能的实现代码
2012/12/23 Javascript
输入自动提示搜索提示功能的javascript:sugggestion.js
2013/09/02 Javascript
用JS将搜索的关键字高亮显示实现代码
2013/11/08 Javascript
JS实现的用来对比两个用指定分隔符分割的字符串是否相同
2014/09/19 Javascript
JavaScript中数组继承的简单示例
2015/07/29 Javascript
给angular加上动画效遇到的问题总结
2016/02/17 Javascript
JavaScript  cookie 跨域访问之广告推广
2016/04/20 Javascript
jQuery前端开发35个小技巧
2016/05/24 Javascript
微信小程序 本地存储及登录页面处理实例详解
2017/01/11 Javascript
关于vue.js v-bind 的一些理解和思考
2017/06/06 Javascript
JavaScript对JSON数据进行排序和搜索
2017/07/24 Javascript
详解vue中this.$emit()的返回值是什么
2019/04/07 Javascript
JS数组方法concat()用法实例分析
2020/01/18 Javascript
[47:53]DOTA2上海特级锦标赛主赛事日 - 1 败者组第一轮#2COL VS Spirit
2016/03/02 DOTA
使用PYTHON接收多播数据的代码
2012/03/01 Python
python实现数独算法实例
2015/06/09 Python
django框架如何集成celery进行开发
2017/05/24 Python
Python实现好友全头像的拼接实例(推荐)
2017/06/24 Python
Python编程求质数实例代码
2018/01/31 Python
python实现简单淘宝秒杀功能
2018/05/03 Python
python列表list保留顺序去重的实例
2018/12/14 Python
python实现转盘效果 python实现轮盘抽奖游戏
2019/01/22 Python
Django中Aggregation聚合的基本使用方法
2020/07/09 Python
Tenstickers法国:墙贴和装饰贴纸
2019/08/26 全球购物
linux面试题参考答案(8)
2016/04/19 面试题
校长先进事迹材料
2014/02/01 职场文书
护理专科毕业生自荐书范文
2014/02/19 职场文书
《小猫刮胡子》教学反思
2014/02/21 职场文书
公司财务流程之主管工作流程
2014/03/03 职场文书