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实现两边飘浮可关闭的对联广告
Nov 27 Javascript
全面解析Bootstrap中nav、collapse的使用方法
May 22 Javascript
jQuery实现定位滚动条位置
Aug 05 Javascript
微信小程序 progress组件详解及实例代码
Oct 25 Javascript
jQuery设置图片等比例缩小的方法
Apr 29 jQuery
vue v-model表单控件绑定详解
May 17 Javascript
微信小程序 wx.request方法的异步封装实例详解
May 18 Javascript
详解微信小程序设置底部导航栏目方法
Jun 29 Javascript
关于laydate.js加载laydate.css路径错误问题解决
Dec 27 Javascript
JS实现前端页面的搜索功能
Jun 12 Javascript
微信小程序select下拉框实现效果
May 15 Javascript
关于element-ui的隐藏组件el-scrollbar的使用
May 29 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将mysql数据库整库导出生成sql文件的具体实现
2014/01/08 PHP
php封装的smarty类完整实例
2016/10/19 PHP
vmware linux系统安装最新的php7图解
2019/04/14 PHP
PHP+Apache实现二级域名之间共享cookie的方法
2019/07/24 PHP
js模拟实现Array的sort方法
2007/12/11 Javascript
js网页中的(运行代码)功能实现思路
2013/02/04 Javascript
JS小功能(onmouseover实现选择月份)实例代码
2013/11/28 Javascript
点击按钮自动加关注的代码(sina微博/QQ空间/人人网/腾讯微博)
2014/01/02 Javascript
js 操作符汇总
2014/11/08 Javascript
javascript实现通过表格绘制颜色填充矩形的方法
2015/04/21 Javascript
AngularJS  $modal弹出框实例代码
2016/08/24 Javascript
JS中parseInt()和map()用法分析
2016/12/16 Javascript
js select下拉联动 更具级联性!
2020/04/17 Javascript
JS简单实现数组去重的方法示例
2017/03/27 Javascript
js基于FileSaver.js 浏览器导出Excel文件的示例
2017/08/15 Javascript
最全正则表达式总结:验证QQ号、手机号、Email、中文、邮编、身份证、IP地址等
2017/08/16 Javascript
VUE项目中加载已保存的笔记实例方法
2019/09/14 Javascript
微信小程序页面渲染实现方法
2019/11/06 Javascript
原生JavaScript实现幻灯片效果
2021/02/19 Javascript
详谈Python基础之内置函数和递归
2017/06/21 Python
python实现二分查找算法
2017/09/21 Python
python中requests爬去网页内容出现乱码问题解决方法介绍
2017/10/25 Python
python2.7无法使用pip的解决方法(安装easy_install)
2018/04/03 Python
Python删除n行后的其他行方法
2019/01/28 Python
使用python3调用wxpy模块监控linux日志并定时发送消息给群组或好友
2019/06/05 Python
通过cmd进入python的实例操作
2019/06/26 Python
python用opencv 图像傅里叶变换
2021/01/04 Python
HTML5中视频音频的使用详解
2017/07/07 HTML / CSS
马来西亚最大的在线隐形眼镜商店:MrLens
2019/03/27 全球购物
美国第一大药店连锁机构:Walgreens(沃尔格林)
2019/10/10 全球购物
教育学专业毕业生的自我评价
2013/11/21 职场文书
应届生如何写自荐信
2014/01/05 职场文书
市场专员岗位职责
2014/02/14 职场文书
2014年小学班主任工作总结
2014/11/08 职场文书
车间主任岗位职责
2015/02/03 职场文书
Python基础详解之邮件处理
2021/04/28 Python