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 相关文章推荐
XML的代替者----JSON
Jul 21 Javascript
JQuery插入DOM节点的方法
Jun 11 Javascript
理解js对象继承的N种模式
Jan 25 Javascript
JavaScript获取IP获取的是IPV6 如何校验
Jun 12 Javascript
关于微信jssdk实现多图片上传的一点心得分享
Dec 13 Javascript
node.js 抓取代理ip实例代码
Apr 30 Javascript
vue子组件使用自定义事件向父组件传递数据
May 27 Javascript
jquery.uploadView 实现图片预览上传功能
Aug 10 jQuery
浅析vue-router jquery和params传参(接收参数)$router $route的区别
Aug 03 jQuery
Vue2.0实现组件之间数据交互和通信操作示例
May 16 Javascript
微信小程序云开发之模拟后台增删改查
May 16 Javascript
微信小程序实现同时上传多张图片
Feb 03 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
索尼SONY SRF-S83/84电路分析和打磨
2021/03/02 无线电
山进SANGEAN ATS-909X电路分析
2021/03/02 无线电
php+js实现的无刷新下载文件功能示例
2019/08/23 PHP
$()JS小技巧
2007/07/21 Javascript
Mootools 1.2教程 正则表达式
2009/09/15 Javascript
JS setCapture 区域外事件捕捉
2010/03/18 Javascript
理解Javascript_11_constructor实现原理
2010/10/18 Javascript
JQuery 1.3.2以上版本中出现pareseerror错误的解决方法
2011/01/11 Javascript
js模拟点击以提交表单为例兼容主流浏览器
2013/11/29 Javascript
jQuery表单域选择器用法分析
2015/02/10 Javascript
深入理解JavaScript系列(26):设计模式之构造函数模式详解
2015/03/03 Javascript
JQuery判断radio(单选框)是否选中和获取选中值方法总结
2015/04/15 Javascript
深入分析下javascript中的[]()+!
2015/07/07 Javascript
Angularjs整合微信UI(weui)
2016/03/15 Javascript
前端学习笔记style,currentStyle,getComputedStyle的用法与区别
2016/05/28 Javascript
js获取隐藏元素的宽高
2017/02/24 Javascript
Angular js 实现添加用户、修改密码、敏感字、下拉菜单的综合操作方法
2017/10/24 Javascript
从零开始学习搭建React脚手架项目
2018/08/23 Javascript
微信小程序webview与h5通过postMessage实现实时通讯的实现
2019/08/20 Javascript
js实现双人五子棋小游戏
2020/05/28 Javascript
Vue切换组件实现返回后不重置数据,保留历史设置操作
2020/07/21 Javascript
解决vue-router路由拦截造成死循环问题
2020/08/05 Javascript
python正则表达式修复网站文章字体不统一的解决方法
2013/02/21 Python
Python实现简单的可逆加密程序实例
2015/03/05 Python
python3利用smtplib通过qq邮箱发送邮件方法示例
2017/12/03 Python
详解Numpy中的数组拼接、合并操作(concatenate, append, stack, hstack, vstack, r_, c_等)
2019/05/27 Python
Python3查找列表中重复元素的个数的3种方法详解
2020/02/13 Python
德国汉莎航空中国官网: Lufthansa中国
2017/03/30 全球购物
荷兰演唱会和体育比赛订票网站:viagogo荷兰
2018/04/08 全球购物
Notino希腊:购买香水和美容产品
2019/07/25 全球购物
上海中网科技笔试题
2012/02/19 面试题
高中生学习总结的自我评价范文
2013/10/13 职场文书
制冷与电控专业应届生求职信
2013/11/11 职场文书
财务人员求职自荐书范文
2014/02/10 职场文书
团队口号大全
2014/06/06 职场文书
2016教师学习党章心得体会
2016/01/15 职场文书