JavaScript数据结构与算法之二叉树遍历算法详解【先序、中序、后序】


Posted in Javascript onFebruary 21, 2019

本文实例讲述了JavaScript数据结构与算法之二叉树遍历算法。分享给大家供大家参考,具体如下:

javascript数据结构与算法--二叉树遍历(先序)

先序遍历先访问根节点, 然后以同样方式访问左子树和右子树

JavaScript数据结构与算法之二叉树遍历算法详解【先序、中序、后序】

代码如下:

/*
 *二叉树中,相对较小的值保存在左节点上,较大的值保存在右节点中
 *
 *
 * */
/*用来生成一个节点*/
function Node(data, left, right) {
  this.data = data;//节点存储的数据
  this.left = left;
  this.right = right;
  this.show = show;
}
function show() {
  return this.data;
}
/*用来生成一个二叉树*/
function BST() {
  this.root = null;
  this.insert = insert;
}
/*将数据插入二叉树
 (1)设根节点为当前节点。
 (2)如果待插入节点保存的数据小于当前节点,则设新的当前节点为原节点的左节点;反
 之,执行第4步。
 (3)如果当前节点的左节点为null,就将新的节点插入这个位置,退出循环;反之,继续
 执行下一次循环。
 (4)设新的当前节点为原节点的右节点。
 (5)如果当前节点的右节点为null,就将新的节点插入这个位置,退出循环;反之,继续
 执行下一次循环。
 * */
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) {//如果当前节点的左节点为null,就将新的节点插入这个位置,退出循环;反之,继续执行下一次while循环。
          parent.left = n;
          break;
        }
      }
      else {
        current = current.right;//待插入节点保存的数据小于当前节点,则设新的当前节点为原节点的左节点
        if (current == null) {
          parent.right = n;
          break;
        }
      }
    }
  }
}
/*先序遍历
 *用递归的方法
 */
function preOrder(node) {
  if (!(node == null)) {
    console.log(node.show() + " ");
    preOrder(node.left);
    preOrder(node.right);
  }
}
/* 测试代码 */
var nums = new BST();
nums.insert(23);
nums.insert(45);
nums.insert(16);
nums.insert(37);
nums.insert(3);
nums.insert(99);
nums.insert(22);
console.log("先序遍历: ");
preOrder(nums.root);

运行结果:

JavaScript数据结构与算法之二叉树遍历算法详解【先序、中序、后序】

javascript数据结构与算法--二叉树遍历(中序)

中序遍历按照节点上的键值,以升序访问BST上的所有节点

JavaScript数据结构与算法之二叉树遍历算法详解【先序、中序、后序】

代码如下:

/*
 *二叉树中,相对较小的值保存在左节点上,较大的值保存在右节点中
 *
 *
 * */
/*用来生成一个节点*/
function Node(data, left, right) {
  this.data = data;//节点存储的数据
  this.left = left;
  this.right = right;
  this.show = show;
}
function show() {
  return this.data;
}
/*用来生成一个二叉树*/
function BST() {
  this.root = null;
  this.insert = insert;
}
/*将数据插入二叉树
 (1)设根节点为当前节点。
 (2)如果待插入节点保存的数据小于当前节点,则设新的当前节点为原节点的左节点;反
 之,执行第4步。
 (3)如果当前节点的左节点为null,就将新的节点插入这个位置,退出循环;反之,继续
 执行下一次循环。
 (4)设新的当前节点为原节点的右节点。
 (5)如果当前节点的右节点为null,就将新的节点插入这个位置,退出循环;反之,继续
 执行下一次循环。
 * */
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) {//如果当前节点的左节点为null,就将新的节点插入这个位置,退出循环;反之,继续执行下一次while循环。
          parent.left = n;
          break;
        }
      }
      else {
        current = current.right;//待插入节点保存的数据小于当前节点,则设新的当前节点为原节点的左节点
        if (current == null) {
          parent.right = n;
          break;
        }
      }
    }
  }
}
/*中序遍历
*用递归的方法
*/
function inOrder(node) {
  if (!(node == null)) {
    inOrder(node.left);
    console.log(node.show() + " ");
    inOrder(node.right);
  }
}
/* 测试代码 */
var nums = new BST();
nums.insert(23);
nums.insert(45);
nums.insert(16);
nums.insert(37);
nums.insert(3);
nums.insert(99);
nums.insert(22);
console.log("中序遍历: ");
inOrder(nums.root);

运行结果:

JavaScript数据结构与算法之二叉树遍历算法详解【先序、中序、后序】

javascript数据结构与算法--二叉树遍历(后序)

后序遍历先访问叶子节点,从左子树到右子树,再到根节点。

/*
 *二叉树中,相对较小的值保存在左节点上,较大的值保存在右节点中
 *
 *
 * */
/*用来生成一个节点*/
function Node(data, left, right) {
  this.data = data;//节点存储的数据
  this.left = left;
  this.right = right;
  this.show = show;
}
function show() {
  return this.data;
}
/*用来生成一个二叉树*/
function BST() {
  this.root = null;
  this.insert = insert;
}
/*将数据插入二叉树
 (1)设根节点为当前节点。
 (2)如果待插入节点保存的数据小于当前节点,则设新的当前节点为原节点的左节点;反
 之,执行第4步。
 (3)如果当前节点的左节点为null,就将新的节点插入这个位置,退出循环;反之,继续
 执行下一次循环。
 (4)设新的当前节点为原节点的右节点。
 (5)如果当前节点的右节点为null,就将新的节点插入这个位置,退出循环;反之,继续
 执行下一次循环。
 * */
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) {//如果当前节点的左节点为null,就将新的节点插入这个位置,退出循环;反之,继续执行下一次while循环。
          parent.left = n;
          break;
        }
      }
      else {
        current = current.right;//待插入节点保存的数据小于当前节点,则设新的当前节点为原节点的左节点
        if (current == null) {
          parent.right = n;
          break;
        }
      }
    }
  }
}
/*后序遍历
 *用递归的方法
 */
function postOrder(node) {
  if (!(node == null)) {
    postOrder(node.left);
    postOrder(node.right);
    console.log(node.show() + " ");
  }
}
/* 测试代码 */
var nums = new BST();
nums.insert(23);
nums.insert(45);
nums.insert(16);
nums.insert(37);
nums.insert(3);
nums.insert(99);
nums.insert(22);
console.log("后序遍历: ");
postOrder(nums.root);

运行结果:

JavaScript数据结构与算法之二叉树遍历算法详解【先序、中序、后序】

感兴趣的朋友可以使用在线HTML/CSS/JavaScript代码运行工具:http://tools.3water.com/code/HtmlJsRun测试上述代码运行效果。

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
JavaScript数组函数unshift、shift、pop、push使用实例
Aug 27 Javascript
JS原型、原型链深入理解
Feb 27 Javascript
js 动态给元素添加、移除事件的实现方法
Jul 19 Javascript
基于touch.js手势库+zepto.js插件开发图片查看器(滑动、缩放、双击缩放)
Nov 17 Javascript
JQuery 封装 Ajax 常用方法(推荐)
May 21 jQuery
vue v-model实现自定义样式多选与单选功能
Jul 05 Javascript
前端axios下载excel文件(二进制)的处理方法
Jul 31 Javascript
webpack4.0 入门实践教程
Oct 08 Javascript
js Array.slice的8种不同用法示例
Jul 10 Javascript
JavaScript字符和ASCII实现互相转换
Jun 03 Javascript
在VUE style中使用data中的变量的方法
Jun 19 Javascript
three.js中多线程的使用及性能测试详解
Jan 07 Javascript
Vue动态生成el-checkbox点击无法赋值的解决方法
Feb 21 #Javascript
JavaScript数据结构与算法之基本排序算法定义与效率比较【冒泡、选择、插入排序】
Feb 21 #Javascript
JavaScript数据结构与算法之二叉树插入节点、生成二叉树示例
Feb 21 #Javascript
angularjs实现table表格td单元格单击变输入框/可编辑状态示例
Feb 21 #Javascript
Vue实现table上下移动功能示例
Feb 21 #Javascript
JavaScript数组、json对象、eval()函数用法实例分析
Feb 21 #Javascript
ES6基础之解构赋值(destructuring assignment)
Feb 21 #Javascript
You might like
PHP的FTP学习(一)[转自奥索]
2006/10/09 PHP
PHP获取搜索引擎关键字来源的函数(支持百度和谷歌等搜索引擎)
2012/10/03 PHP
PHP扩展模块memcached长连接使用方法分析
2014/12/24 PHP
PHP+Ajax实现无刷新分页实例详解(附demo源码下载)
2016/04/07 PHP
Dojo之路:如何利用Dojo实现Drag and Drop效果
2007/04/10 Javascript
Extjs Ajax 乱码问题解决方案
2009/04/15 Javascript
jQuery 动态酷效果实现总结
2009/12/27 Javascript
Angularjs制作简单的路由功能demo
2015/04/14 Javascript
Javascript模仿淘宝信用评价实例(附源码)
2015/11/26 Javascript
学习掌握JavaScript中this的使用技巧
2016/08/29 Javascript
jQuery实现的小图列表,大图展示效果幻灯片示例
2016/10/25 Javascript
AngularJS过滤器filter用法总结
2016/12/13 Javascript
浅谈Vuejs中nextTick()异步更新队列源码解析
2017/12/31 Javascript
详解如何在Angular优雅编写HTTP请求
2018/12/05 Javascript
ES6知识点整理之数组解构和字符串解构的应用示例
2019/04/17 Javascript
JS实现数组删除指定元素功能示例
2019/06/05 Javascript
比较详细Python正则表达式操作指南(re使用)
2008/09/06 Python
python实现linux服务器批量修改密码并生成execl
2014/04/22 Python
python生成器generator用法实例分析
2015/06/04 Python
Python 3.6打包成EXE可执行程序的实现
2019/10/18 Python
使用 Python 读取电子表格中的数据实例详解
2020/04/17 Python
Pytorch 使用opnecv读入图像由HWC转为BCHW格式方式
2020/06/02 Python
你不知道的5个HTML5新功能
2016/06/28 HTML / CSS
精致的手工皮鞋:Shoe Embassy
2019/11/08 全球购物
乌克兰网上珠宝商店:GoldSoveren
2020/03/31 全球购物
公司员工的自我评价范例
2013/11/01 职场文书
学习心得体会
2014/01/01 职场文书
初一科学教学反思
2014/01/27 职场文书
市场总经理岗位职责
2014/04/11 职场文书
护理专科学生自荐书
2014/07/05 职场文书
法人代表身份证明书及授权委托书
2014/09/16 职场文书
2015年社区中秋节活动总结
2015/03/23 职场文书
周末问候语大全
2015/11/10 职场文书
Jupyter Notebook 如何修改字体和大小以及更改字体样式
2021/06/03 Python
windows11怎么查看自己安装的版本号? win11版本号的查看方法
2021/11/21 数码科技
Vue中使用import进行路由懒加载的原理分析
2022/04/01 Vue.js