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 点击整页变灰的效果(可做退出效果)。
Jan 09 Javascript
JQuery与Ajax调用新浪API获取短网址的代码
Feb 07 Javascript
WEB前端设计师常用工具集锦
Dec 09 Javascript
详解原生js实现offset方法
Jun 15 Javascript
使用vue-router设置每个页面的title方法
Feb 11 Javascript
D3.js实现简洁实用的动态仪表盘的示例
Apr 04 Javascript
vue中v-for通过动态绑定class实现触发效果
Dec 06 Javascript
浅谈bootstrap layer.open中end的使用方法
Sep 12 Javascript
对layui数据表格动态cols(字段)动态变化详解
Oct 25 Javascript
解决包含在label标签下的checkbox在ie8及以下版本点击事件无效果兼容的问题
Oct 27 Javascript
微信小程序停止其他视频播放当前视频的实例代码
Dec 25 Javascript
JavaScript大数相加相乘的实现方法实例
Oct 18 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过滤表单提交的html等危险代码
2014/11/03 PHP
php header函数的常用http头设置
2015/06/25 PHP
JQuery 学习笔记 选择器之一
2009/07/23 Javascript
html 锁定页面(js遮罩层弹出div效果)
2009/10/27 Javascript
Node.js模拟浏览器文件上传示例
2014/03/26 Javascript
JavaScript 事件对象介绍
2015/04/13 Javascript
jQuery使用$.ajax进行即时验证的方法
2015/12/08 Javascript
jQuery mobile 移动web(4)
2015/12/20 Javascript
jQuery validate插件实现ajax验证重复的2种方法
2016/01/22 Javascript
jQuery中设置form表单中action值的实现方法
2016/05/25 Javascript
js 实现省市区三级联动菜单效果
2017/02/20 Javascript
ES5学习教程之Array对象
2017/04/01 Javascript
JS实现的全排列组合算法示例
2017/10/09 Javascript
基于vue.js无缝滚动效果
2018/01/25 Javascript
vue+mousemove实现鼠标拖动功能(拖动过快失效问题解决方法)
2018/08/24 Javascript
js实现web调用摄像头 js截取视频画面
2019/04/21 Javascript
详解微信小程序-canvas绘制文字实现自动换行
2019/04/26 Javascript
vue实现给div绑定keyup的enter事件
2020/07/31 Javascript
vue v-on:click传递动态参数的步骤
2020/09/11 Javascript
Python日期操作学习笔记
2008/10/07 Python
python逐行读取文件内容的三种方法
2014/01/20 Python
python网页请求urllib2模块简单封装代码
2014/02/07 Python
urllib和BeautifulSoup爬取维基百科的词条简单实例
2018/01/17 Python
PyQt5创建一个新窗口的实例
2019/06/20 Python
python命令行参数用法实例分析
2019/06/25 Python
python代码 FTP备份交换机配置脚本实例解析
2019/08/01 Python
Python定义函数时参数有默认值问题解决
2019/12/19 Python
python实现感知机模型的示例
2020/09/30 Python
matplotlib绘制正余弦曲线图的实现
2021/02/22 Python
css3实现文字扫光渐变动画效果的示例
2017/11/07 HTML / CSS
NBA欧洲商店(英国):NBA Europe Store UK
2018/07/27 全球购物
网络编辑岗位职责范本
2014/02/10 职场文书
安全在我心中演讲稿
2014/09/01 职场文书
升职自荐信范文
2015/03/27 职场文书
浅谈哪个Python库才最适合做数据可视化
2021/06/28 Python