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 继承实现方法
Aug 26 Javascript
jQuery 源码分析笔记(2) 变量列表
May 28 Javascript
jquery 触发a链接点击事件解决方案
May 02 Javascript
JavaScript字符串对象fromCharCode方法入门实例(用于把Unicode值转换为字符串)
Oct 17 Javascript
利用jquery操作Radio方法小结
Oct 20 Javascript
angular实现IM聊天图片发送实例
May 08 Javascript
underscore之Chaining_动力节点Java学院整理
Jul 10 Javascript
JavaScript实现单例模式实例分享
Dec 22 Javascript
Node.js成为Web应用开发最佳选择的原因
Feb 05 Javascript
JQuery模拟实现网页中自定义鼠标右键菜单功能
Nov 14 jQuery
解决vue的过渡动画无法正常实现问题
Oct 31 Javascript
JS图片懒加载的优点及实现原理
Jan 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
escape unescape的php下的实现方法
2007/04/27 PHP
php下关于中英数字混排的字符串分割问题
2010/04/06 PHP
thinkphp实现图片上传功能
2016/01/13 PHP
PHP实现的浏览器检查类
2016/04/11 PHP
Zend Framework数据库操作方法实例总结
2016/12/11 PHP
经验几则 推荐
2006/09/05 Javascript
Javascript中克隆一个数组的实现代码
2013/12/06 Javascript
jQuery新的事件绑定机制on()示例应用
2014/07/18 Javascript
js文件包含的几种方式介绍
2014/09/28 Javascript
JQuery中DOM加载与事件执行实例分析
2015/06/13 Javascript
JS实现的车标图片提示效果代码
2015/10/10 Javascript
jQuery的ready方法实现原理分析
2016/10/26 Javascript
微信小程序 后台https域名绑定和免费的https证书申请详解
2016/11/10 Javascript
移动端基础事件总结与应用
2017/01/12 Javascript
Angular中的$watch方法详解
2017/09/18 Javascript
javascript Function函数理解与实战
2017/12/01 Javascript
webpack本地开发环境无法用IP访问的解决方法
2018/03/20 Javascript
jQuery实现图片简单轮播功能示例
2018/08/13 jQuery
基于postman获取动态数据过程详解
2020/09/08 Javascript
python计数排序和基数排序算法实例
2014/04/25 Python
python生成二维码的实例详解
2017/10/29 Python
python中的二维列表实例详解
2018/06/19 Python
Python Pandas中根据列的值选取多行数据
2019/07/08 Python
基于Python实现拆分和合并GIF动态图
2019/10/22 Python
python 使用opencv 把视频分割成图片示例
2019/12/12 Python
Pytorch 实现权重初始化
2019/12/31 Python
从多个tfrecord文件中无限读取文件的例子
2020/02/17 Python
Python递归函数特点及原理解析
2020/03/04 Python
python实现ftp文件传输功能
2020/03/20 Python
2014年情人节活动方案
2014/02/16 职场文书
美术指导助理求职信
2014/04/20 职场文书
学生保证书范文
2014/04/28 职场文书
县级文明单位申报材料
2014/05/23 职场文书
项目经理任命书范本
2014/06/05 职场文书
初中差生评语
2014/12/29 职场文书
党校学习个人总结
2015/02/15 职场文书