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 相关文章推荐
利用google提供的API(JavaScript接口)获取网站访问者IP地理位置的代码详解
Jul 24 Javascript
基于Jquery的动态创建DOM元素的代码
Dec 28 Javascript
js弹出层之1:JQuery.Boxy (二)
Oct 06 Javascript
使用jQuery解决IE与FireFox下createElement方法的差异
Nov 14 Javascript
jquery的attr方法禁用表单元素禁用输入内容
Jun 23 Javascript
分享9个最好用的JavaScript开发工具和代码编辑器
Mar 24 Javascript
Angular.js与Bootstrap相结合实现表格分页代码
Apr 12 Javascript
AngularJS实现controller控制器间共享数据的方法示例
Oct 30 Javascript
详解webpack与SPA实践之开发环境搭建
Dec 18 Javascript
p5.js实现斐波那契螺旋的示例代码
Mar 22 Javascript
Node.js API详解之 os模块用法实例分析
May 06 Javascript
javascript实现放大镜功能
Dec 09 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
WINXP下apache+php4+mysql
2006/11/25 PHP
如何突破PHP程序员的技术瓶颈分析
2011/07/17 PHP
php实现的双色球算法示例
2017/06/20 PHP
js可突破windows弹退效果代码
2008/08/09 Javascript
高性能web开发 如何加载JS,JS应该放在什么位置?
2010/05/14 Javascript
将HTMLCollection/NodeList/伪数组转换成数组的实现方法
2011/06/20 Javascript
JS制作适用于手机和电脑的通知信息效果
2016/10/28 Javascript
基于bootstrap风格的弹框插件
2016/12/28 Javascript
纯js实现画一棵树的示例
2017/09/05 Javascript
React Native 自定义下拉刷新上拉加载的列表的示例
2018/03/01 Javascript
JS实现的合并多个数组去重算法示例
2018/04/11 Javascript
Vue iview-admin框架二级菜单改为三级菜单的方法
2018/07/03 Javascript
Js 利用正则表达式和replace函数获取string中所有被匹配到的文本(推荐)
2018/10/28 Javascript
深入理解es6块级作用域的使用
2019/03/28 Javascript
一篇文章带你浅入webpack的DLL优化打包
2020/02/20 Javascript
python设置windows桌面壁纸的实现代码
2013/01/28 Python
介绍Python的Django框架中的QuerySets
2015/04/20 Python
详解Python3中yield生成器的用法
2015/08/20 Python
完美解决Python2操作中文名文件乱码的问题
2017/01/04 Python
Python网络编程 Python套接字编程
2017/09/13 Python
PyTorch快速搭建神经网络及其保存提取方法详解
2018/04/28 Python
numpy.linspace 生成等差数组的方法
2018/07/02 Python
python3.6.3转化为win-exe文件发布的方法
2018/10/31 Python
python3用PIL把图片转换为RGB图片的实例
2019/07/04 Python
python cv2读取rtsp实时码流按时生成连续视频文件方式
2019/12/25 Python
浅析pandas随机排列与随机抽样
2021/01/22 Python
Myprotein瑞典官方网站:畅销欧洲英国运动营养品牌
2018/01/22 全球购物
Under Armour安德玛意大利官网:美国高端运动科技品牌
2020/01/16 全球购物
大学生最常用的自我评价
2013/12/07 职场文书
借款协议书
2014/04/12 职场文书
表彰大会策划方案
2014/05/13 职场文书
社区平安建设方案
2014/05/25 职场文书
乡镇法制宣传日活动总结
2015/05/05 职场文书
2015年度酒店客房部工作总结
2015/05/25 职场文书
诚信教育主题班会
2015/08/13 职场文书
MySQL CHAR和VARCHAR该如何选择
2021/05/31 MySQL