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 相关文章推荐
解密效果
Jun 23 Javascript
又一个小巧的图片预加载类
May 05 Javascript
javascript 表单规则集合对象
Jul 21 Javascript
jQuery 加上最后自己的验证
Nov 04 Javascript
javascript 设计模式之单体模式 面向对象学习基础
Apr 18 Javascript
js 采用delete实现继承示例代码
May 20 Javascript
Jquery+ajax+JAVA(servlet)实现下拉菜单异步取值
Mar 23 Javascript
springMVC结合AjaxForm上传文件
Jul 12 Javascript
node.js学习之base64编码解码
Oct 21 Javascript
vuejs通过filterBy、orderBy实现搜索筛选、降序排序数据
Oct 26 Javascript
this在vue和小程序中的使用详解
Jan 28 Javascript
基于JavaScript实现轮播图效果
Jan 02 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 array_slice函数的使用以及参数详解
2008/08/30 PHP
php中session_unset与session_destroy的区别分析
2011/06/16 PHP
PHP跳转页面的几种实现方法详解
2013/06/08 PHP
PHP 搜索查询功能实现
2016/11/29 PHP
一个对于Array的简单扩展
2006/10/03 Javascript
自制轻量级仿jQuery.boxy对话框插件代码
2010/10/26 Javascript
基于JQUERY的多级联动代码
2012/01/24 Javascript
js屏蔽鼠标键盘(右键/Ctrl+N/Shift+F10/F11/F5刷新/退格键)
2013/01/24 Javascript
js改变Iframe中Src的方法
2015/05/05 Javascript
JSON字符串和对象之间的转换详解
2015/05/26 Javascript
JavaScript子窗口调用父窗口变量和函数的方法
2015/10/09 Javascript
JavaScript记录光标在编辑器中位置的实现方法
2016/04/22 Javascript
如何解决手机浏览器页面点击不跳转浏览器双击放大网页
2016/07/01 Javascript
jQuery操作之效果详解
2017/05/19 jQuery
浅谈node模块与npm包管理工具
2018/01/03 Javascript
详解vue微信网页授权最终解决方案
2019/06/16 Javascript
Vue解析剪切板图片并实现发送功能
2020/02/04 Javascript
js+canvas实现简单扫雷小游戏
2021/01/22 Javascript
JavaScript 正则应用详解【模式、欲查、反向引用等】
2020/05/13 Javascript
python算法学习之桶排序算法实例(分块排序)
2013/12/18 Python
Python3.2中Print函数用法实例详解
2015/05/19 Python
Windows下Python使用Pandas模块操作Excel文件的教程
2016/05/31 Python
在python的类中动态添加属性与生成对象
2016/09/17 Python
简单谈谈Python中的闭包
2016/11/30 Python
python3+PyQt5实现拖放功能
2018/04/24 Python
在 Linux/Mac 下为Python函数添加超时时间的方法
2020/02/20 Python
pyinstaller打包找不到文件的问题解决
2020/04/15 Python
Django admin管理工具TabularInline类用法详解
2020/05/14 Python
解决keras backend 越跑越慢问题
2020/06/18 Python
python3 中时间戳、时间、日期的转换和加减操作
2020/07/14 Python
小狗电器官方商城:中国高端吸尘器品牌
2017/03/29 全球购物
春节联欢晚会主持词范文
2014/03/24 职场文书
退休教师欢送会主持词
2014/03/31 职场文书
公司节能减排倡议书
2014/05/14 职场文书
依法行政工作汇报
2014/10/28 职场文书
baselines示例程序train_cartpole.py的ImportError
2022/05/20 Python