javascript实现二叉树遍历的代码


Posted in Javascript onJune 08, 2017

前言:

紧接着上篇 二叉树的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;
}
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;
      }
     }
   }
  }
}

二叉树遍历的分类

二叉树的遍历分为先序、中序、后序遍历。这里说到的先序、中序、后序是相对于父节点来说。父节点的值先输出就是先序,三者间它在中间输出就是中序,最后输出就是后序。至于那个是父节点是相对而言的,因为除了叶子节点(最底下一层节点),其他每个节点都可以是父节点。

javascript实现二叉树遍历的代码

先序遍历

先序遍历就是,先打印父节点,然后是左子节点(左子树),然后再打印右子节点(子树)。

function preOrder(node) {
  if (!(node == null)) {
   console.log(node.show() + " ");
   preOrder(node.left);
   preOrder(node.right);
  }
}

// 给BST类添加先序遍历的成员方法
function BST() {
  this.root = null;
  this.insert = insert;
  this.preOrder = preOrder;
}

preOrder函数是递归实现的,应该说二叉树的遍历都是递归实现的。可能有些人会因为先序遍历的特征:“先打印父节点,然后是左子节点(左子树),然后再打印右子节点(子树)” 而陷入一个错误的想法,这想法是什么请看下图:

javascript实现二叉树遍历的代码

注意红框部分,父节点是10,左子节点是3,右子节点是18,因为上面的结论,可能会错误地认为打印的顺序是10 → 3 → 18,然而事实并非如此[捂脸],真是的顺序是:先打印10,然后是打印左子树,打印完左子树的全部节点后,才开始打印以10位父节点的右子树:

javascript实现二叉树遍历的代码

这个时候,你的脑海就该这样想:

javascript实现二叉树遍历的代码

然后是这样想:

javascript实现二叉树遍历的代码

如此类推打印完以10为父节点的左子树,然后也是以这样的方式打印以10为父节点的右子树,按着这种 拆分代替的思想 来理解会更好明白二叉树的遍历。

然后最终,先序遍历改二叉树的顺序是:

javascript实现二叉树遍历的代码

按图的输出顺序是:10 -> 3 -> 2 -> 4 -> 9 -> 8 -> 9 -> 18 -> 13 -> 21

最后来实践一下,先序遍历:

var bst = new BST();
var nums = [10, 3, 18, 2, 4, 13, 21, 9, 8, 9];
for(var i = 0; i < nums.length; i++) {
  bst.insert(nums[i]);
}
bst.preOrder(bst.root);

javascript实现二叉树遍历的代码

这里强调一下,输出顺序和插入顺序有关的,因为你插入顺序不同生成的二叉树也是不同的。有疑问的可以去 二叉树的javascript实现 细看一下,有比较明白的说明了二叉树,也可以实验一下:

javascript实现二叉树遍历的代码

中序遍历

看完先序遍历,已经可以类推到很多和中序、后序遍历相关的知识点。中序遍历的特征是:先打印左子树(左子节点),接着打印父节点,最后打印右子树(右子节点)。

function inOrder(node) {
  if (!(node == null)) {
   inOrder(node.left);
   console.log(node.show() + " ");
   inOrder(node.right);
  }
}

// 给BST类添加该成员方法
function BST() {
  this.root = null;
  this.insert = insert;
  this.preOrder = preOrder;
  this.inOrder = inOrder;
}

中序遍历的打印顺序:

javascript实现二叉树遍历的代码

按上图的输出顺序是:2 -> 3 -> 4 -> 8 -> 9 -> 9 -> 10 -> 13 -> 18 -> 21

接着是,实践一下中序遍历:

javascript实现二叉树遍历的代码

后序遍历

function postOrder(node) {
  if (!(node == null)) {
   postOrder(node.left);
   postOrder(node.right);
   console.log(node.show() + " ");
  }
}

// 给BST类添加该成员方法
function BST() {
  this.root = null;
  this.insert = insert;
  this.preOrder = preOrder;
  this.inOrder = inOrder;
  this.postOrder = postOrder;
}

后序遍历的打印顺序

javascript实现二叉树遍历的代码

按上图的输出顺序是:2 -> 8 -> 9 -> 9 -> 4 -> 3 -> 13 -> 21 -> 18  -> 10

javascript实现二叉树遍历的代码

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JavaScript 保存数组到Cookie的代码
Apr 14 Javascript
jquery()函数的三种语法介绍
Oct 09 Javascript
5种处理js跨域问题方法汇总
Dec 04 Javascript
JavaScript中的标签语句用法分析
Feb 10 Javascript
使用jQuery处理AJAX请求的基础学习教程
May 10 Javascript
jquery 将当前时间转换成yyyymmdd格式的实现方法
Jun 01 Javascript
轻松实现jquery选项卡切换效果
Oct 10 Javascript
原生javascript实现的ajax异步封装功能示例
Nov 03 Javascript
jQuery Validate让普通按钮触发表单验证的方法
Dec 15 Javascript
ES6新特性二:Iterator(遍历器)和for-of循环详解
Apr 20 Javascript
JS实现图片懒加载(lazyload)过程详解
Apr 02 Javascript
typescript配置alias的详细步骤
Aug 12 Javascript
微信小程序tabbar不显示解决办法
Jun 08 #Javascript
javascript实现二叉树的代码
Jun 08 #Javascript
微信小程序搜索组件wxSearch实例详解
Jun 08 #Javascript
JS去掉字符串前后空格、阻止表单提交的实现代码
Jun 08 #Javascript
angular实现图片懒加载实例代码
Jun 08 #Javascript
微信小程序日历组件calendar详解及实例
Jun 08 #Javascript
php简单数据库操作类的封装
Jun 08 #Javascript
You might like
php中文件上传的安全问题
2006/10/09 PHP
PHP中“简单工厂模式”实例代码讲解
2012/09/04 PHP
PHP 常用数组内部函数(Array Functions)介绍
2013/06/05 PHP
解析php开发中的中文编码问题
2013/08/08 PHP
php获取从百度搜索进入网站的关键词的详细代码
2014/01/08 PHP
开发跨浏览器javascript常见注意事项
2009/01/01 Javascript
修改jquery.lazyload.js实现页面延迟载入
2010/12/22 Javascript
jquery中交替点击事件toggle方法的使用示例
2013/12/08 Javascript
JavaScript省市联动实现代码
2014/02/15 Javascript
浅谈JavaScript中Date(日期对象),Math对象
2015/02/05 Javascript
JS实现自适应高度表单文本框的方法
2015/02/25 Javascript
基于jQuery实现网页进度显示插件
2015/03/04 Javascript
js 连续赋值的简单实现
2016/06/13 Javascript
WEB前端实现裁剪上传图片功能
2016/10/17 Javascript
Node.js数据库操作之查询MySQL数据库(二)
2017/03/04 Javascript
微信小程序 navbar实例详解
2017/05/11 Javascript
vue 路由页面之间实现用手指进行滑动的方法
2018/02/23 Javascript
详解vue项目打包步骤
2019/03/29 Javascript
JS实现图片轮播效果实例详解【可自动和手动】
2019/04/04 Javascript
Node.js 实现抢票小工具 &amp; 短信通知提醒功能
2019/10/22 Javascript
element-ui 文件上传修改文件名的方法示例
2019/11/05 Javascript
python实现去除下载电影和电视剧文件名中的多余字符的方法
2014/09/23 Python
python实现xlsx文件分析详解
2018/01/02 Python
如何基于Python实现电子邮件的发送
2019/12/16 Python
Python装饰器实现方法及应用场景详解
2020/03/26 Python
Python实现我的世界小游戏源代码
2021/03/02 Python
沪江旗下的海量优质课程平台:沪江网校
2017/11/07 全球购物
澳大利亚手表品牌:Time IV Change
2018/10/06 全球购物
银行介绍信范文
2014/01/10 职场文书
社会实践评语
2014/04/28 职场文书
导师推荐信范文
2014/05/09 职场文书
廉洁自律演讲稿
2014/05/22 职场文书
安全生产宣传标语
2014/06/06 职场文书
评奖评优个人先进事迹材料
2015/11/04 职场文书
看古人们是如何赞美老师的?
2019/07/08 职场文书
阿里云k8s服务升级时502错误 springboot项目应用
2022/04/09 Servers