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 相关文章推荐
Extjs4实现两个GridPanel之间数据拖拽功能具体方法
Nov 21 Javascript
JS实现文字链接感应鼠标淡入淡出改变颜色的方法
Feb 26 Javascript
js数组常见操作及数组与字符串相互转化实例详解
Nov 10 Javascript
果断收藏9个Javascript代码高亮脚本
Jan 06 Javascript
Bootstrap中文本框的宽度变窄并且加入一副验证码图片的实现方法
Jun 23 Javascript
原生js实现节日时间倒计时功能
Jan 18 Javascript
Vue.Js中的$watch()方法总结
Mar 23 Javascript
JS实现的简单表单验证功能完整实例
Oct 14 Javascript
element-ui表格列金额显示两位小数的方法
Aug 24 Javascript
基于JS开发微信网页录音功能的实例代码
Apr 30 Javascript
微信小程序实现打卡签到页面
Sep 21 Javascript
Vue图片裁剪组件实例代码
Jul 02 Vue.js
微信小程序搜索组件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中计算未知长度的字符串哪个字符出现的次数最多的代码
2012/08/14 PHP
详谈PHP文件目录基础操作
2014/11/11 PHP
用PHP将Unicode 转化为UTF-8的实现方法(推荐)
2017/02/08 PHP
php实现和c#一致的DES加密解密实例
2017/07/24 PHP
PHP实现的62进制转10进制,10进制转62进制函数示例
2019/06/06 PHP
理解JavaScript中的事件
2006/09/23 Javascript
JavaScript设计模式之策略模式实例
2014/10/10 Javascript
js面向对象之公有、私有、静态属性和方法详解
2015/04/17 Javascript
基于Jquery实现万圣节快乐特效
2015/11/01 Javascript
判断输入的字符串是否是日期格式的简单方法
2016/07/11 Javascript
JS关闭窗口时产生的事件及用法示例
2016/08/20 Javascript
JavaScript中双向数据绑定详解
2017/05/03 Javascript
JavaScript正则表达式的贪婪匹配和非贪婪匹配
2017/09/05 Javascript
Vue-Router进阶之滚动行为详解
2017/09/13 Javascript
快速解决select2在bootstrap模态框中下拉框隐藏的问题
2018/08/10 Javascript
Vue移动端实现图片上传及超过1M压缩上传
2019/12/23 Javascript
JS实现移动端可折叠导航菜单(现代都市风)
2020/07/07 Javascript
详解vue中v-on事件监听指令的基本用法
2020/07/22 Javascript
Python学习思维导图(必看篇)
2017/06/26 Python
python web基础之加载静态文件实例
2018/03/20 Python
pandas分别写入excel的不同sheet方法
2018/12/11 Python
linux环境中没有网络怎么下载python
2019/07/07 Python
Python3 tkinter 实现文件读取及保存功能
2019/09/12 Python
python支持多线程的爬虫实例
2019/12/21 Python
PYcharm 激活方法(推荐)
2020/03/23 Python
css3 旋转按钮 使用CSS3创建一个旋转可变色按钮
2012/12/31 HTML / CSS
浅谈HTML5 FileReader分布读取文件以及其方法简介
2017/11/09 HTML / CSS
ghd澳大利亚官方网站:英国最受欢迎的美发工具品牌
2018/05/21 全球购物
造价工程师个人求职信
2013/09/21 职场文书
财务部岗位职责
2013/11/19 职场文书
西门豹教学反思
2014/02/04 职场文书
《桂林山水》教学反思
2014/02/08 职场文书
毕业证丢失证明范本
2014/09/20 职场文书
四风问题民主生活会对照检查材料思想汇报
2014/09/27 职场文书
办公用品质量保证书
2015/05/11 职场文书
python中sys模块的介绍与实例
2021/04/17 Python