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 相关文章推荐
jQuery圆形统计图开发实例
Jan 04 Javascript
javascript显示中文日期的方法
Jun 18 Javascript
一分钟理解js闭包
May 04 Javascript
jQuery使用serialize()表单序列化时出现中文乱码问题的解决办法
Jul 27 Javascript
详解AngularJS中$filter过滤器使用(自定义过滤器)
Feb 04 Javascript
js随机生成一个验证码
Jun 01 Javascript
vue组件生命周期详解
Nov 07 Javascript
动手写一个angular版本的Message组件的方法
Dec 16 Javascript
vue项目中实现图片预览的公用组件功能
Oct 26 Javascript
Vuex 单状态库与多模块状态库详解
Dec 11 Javascript
使用mixins实现elementUI表单全局验证的解决方法
Apr 02 Javascript
JS常用排序方法实例代码解析
Mar 03 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
php5.3 注意事项说明
2013/07/01 PHP
php将字符串转换成16进制的方法
2015/03/17 PHP
PHP编程获取图片的主色调的方法【基于Imagick扩展】
2017/08/02 PHP
php探针不显示内存解决方法
2019/09/17 PHP
laravel框架中视图的基本使用方法分析
2019/11/23 PHP
php获取是星期几的的一些常用姿势
2019/12/15 PHP
JavaScript原型继承之基础机制分析
2011/08/26 Javascript
jquery Tab效果和动态加载的简单实例
2013/12/11 Javascript
jquery解析XML字符串和XML文件的方法说明
2014/02/21 Javascript
理解javascript闭包
2015/12/15 Javascript
javascript中错误使用var造成undefined
2016/03/31 Javascript
jQuery在ie6下无法设置select选中的解决方法详解
2016/09/20 Javascript
微信小程序中单位rpx和rem的使用
2016/12/06 Javascript
js学习心得_一个简单的动画库封装tween.js
2017/07/14 Javascript
jquery实现图片跟随鼠标的实例
2017/10/17 jQuery
Angularjs Promise实例详解
2018/03/15 Javascript
vue组件之间数据传递的方法实例分析
2019/02/12 Javascript
JS倒计时两种实现方式代码实例
2020/07/27 Javascript
vue a标签点击实现赋值方式
2020/09/07 Javascript
HTML元素拖拽功能实现的完整实例
2020/12/04 Javascript
让python同时兼容python2和python3的8个技巧分享
2014/07/11 Python
在Python中操作日期和时间之gmtime()方法的使用
2015/05/22 Python
Django实现学生管理系统
2019/02/26 Python
关于Numpy中的行向量和列向量详解
2019/11/30 Python
解决django migrate报错ORA-02000: missing ALWAYS keyword
2020/07/02 Python
python 实现aes256加密
2020/11/27 Python
使用html5 canvas 画时钟代码实例分享
2015/11/11 HTML / CSS
车间主管岗位职责
2013/11/14 职场文书
创先争优制度
2014/01/21 职场文书
社区安全检查制度
2014/02/03 职场文书
中学生获奖感言
2014/02/04 职场文书
高校优秀辅导员事迹材料
2014/05/07 职场文书
植物园观后感
2015/06/11 职场文书
教务处干事工作总结
2015/08/14 职场文书
小学教师教育随笔
2015/08/14 职场文书
详解Vue的sync修饰符
2021/05/15 Vue.js