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的模仿新浪微博时间的组件
Oct 04 Javascript
jQuery对象和Javascript对象之间转换的实例代码
Mar 20 Javascript
jQuery图片的展开和收缩实现代码
Apr 16 Javascript
javascript操作excel生成报表全攻略
May 04 Javascript
jquery单选框radio绑定click事件实现方法
Jan 14 Javascript
jQuery插件slicebox实现3D动画图片轮播切换特效
Apr 12 Javascript
jQuery实现打开页面渐现效果示例
Jul 27 Javascript
AngularJS中update两次出现$promise属性无法识别的解决方法
Jan 05 Javascript
详解基于Vue-cli搭建的项目如何和后台交互
Jun 29 Javascript
详解vue通过NGINX部署在子目录或者二级目录实践
Sep 03 Javascript
JavaScript回调函数callback用法解析
Jan 14 Javascript
Vue绑定用户接口实现代码示例
Nov 04 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实现多级树型菜单
2006/10/09 PHP
php判断上传的Excel文件中是否有图片及PHPExcel库认识
2013/01/11 PHP
set_include_path和get_include_path使用及注意事项
2013/02/02 PHP
解析PHP自带的进位制之间的转换函数
2013/06/08 PHP
Zend Framework教程之请求对象的封装Zend_Controller_Request实例详解
2016/03/07 PHP
PHP对XML内容进行修改和删除实例代码
2016/10/26 PHP
JSON 入门指南 想了解json的朋友可以看下
2009/08/26 Javascript
Jquery Ajax学习实例5 向WebService发出请求,返回泛型集合数据的异步调用
2010/03/17 Javascript
javascript中获取下个月一号,是星期几
2012/06/01 Javascript
JavaScript实现复制功能各浏览器支持情况实测
2013/07/18 Javascript
JS实现局部选择打印和局部不选择打印
2014/04/03 Javascript
jQuery 遍历函数详解
2015/07/05 Javascript
JS原型链 详解及示例代码
2016/09/06 Javascript
JS扩展类,克隆对象与混合类实例分析
2016/11/26 Javascript
JavaScript中无法通过div.style.left获取值的解决方法
2017/02/19 Javascript
详解Node全局变量global模块
2017/09/28 Javascript
JavaScript对象拷贝与Object.assign用法实例分析
2018/06/20 Javascript
js中this的指向问题归纳总结
2018/11/28 Javascript
在Linux下调试Python代码的各种方法
2015/04/17 Python
Python中的集合类型知识讲解
2015/08/19 Python
PyCharm使用教程之搭建Python开发环境
2016/06/07 Python
python 简单的多线程链接实现代码
2016/08/28 Python
轻松实现TensorFlow微信跳一跳的AI
2018/01/05 Python
详解python的argpare和click模块小结
2019/03/31 Python
修改 CentOS 6.x 上默认Python的方法
2019/09/06 Python
基于python调用psutil模块过程解析
2019/12/20 Python
HTML5实现音频和视频嵌入的方法
2018/08/22 HTML / CSS
Agoda.com官方网站:便宜预订全球酒店,高达80%的折扣
2018/04/04 全球购物
美国精油公司:Plant Therapy
2019/05/17 全球购物
YII2 全局异常处理深入讲解
2021/03/24 PHP
法学研究生自我鉴定范文
2013/12/04 职场文书
公安局班子个人对照检查材料思想汇报
2014/10/09 职场文书
2014年标准化工作总结
2014/12/17 职场文书
邹越演讲观后感
2015/06/15 职场文书
《称赞》教学反思
2016/02/17 职场文书
使用vue-element-admin框架从后端动态获取菜单功能的实现
2021/04/29 Vue.js