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 相关文章推荐
jquery 学习之二 属性(html()与html(val))
Nov 25 Javascript
jquery的ajax简单结构示例代码
Feb 17 Javascript
node.js中的emitter.on方法使用说明
Dec 10 Javascript
JavaScript实现添加及删除事件的方法小结
Aug 04 Javascript
Javascript之BOM(window对象)详解
May 25 Javascript
JS正则RegExp.test()使用注意事项(不具有重复性)
Dec 28 Javascript
js实现年月日表单三级联动
Apr 17 Javascript
React/Redux应用使用Async/Await的方法
Nov 16 Javascript
vue.js默认路由不加载linkActiveClass问题的解决方法
Dec 11 Javascript
Node.js + express实现上传大文件的方法分析【图片、文本文件】
Mar 14 Javascript
jQuery实现聊天对话框
Feb 08 jQuery
Ant Design的可编辑Tree的实现操作
Oct 31 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 date函数参数详解
2006/11/27 PHP
PHP 数组实例说明
2008/08/18 PHP
JavaScript 全面解析各种浏览器网页中的JS 执行顺序
2009/02/17 Javascript
JQuery团队打造的javascript单元测试工具QUnit介绍
2010/02/26 Javascript
jquery利用event.which方法获取键盘输入值的代码
2011/10/09 Javascript
在js中判断checkboxlist(.net控件客户端id)是否有选中
2013/04/11 Javascript
js调用AJAX时Get和post的乱码解决方法
2013/06/04 Javascript
原生javascript实现图片弹窗交互效果
2015/01/12 Javascript
Vue.js每天必学之指令系统与自定义指令
2016/09/07 Javascript
jQuery中fadein与fadeout方法用法示例
2016/09/16 Javascript
javascript作用域链与执行环境详解
2017/03/25 Javascript
微信小程序 列表的上拉加载和下拉刷新的实现
2017/04/01 Javascript
浅谈React Event实现原理
2018/09/20 Javascript
ios中视频的最后一桢问题解决
2019/05/14 Javascript
react+redux仿微信聊天界面
2019/06/21 Javascript
Node.js学习教程之Module模块
2019/09/03 Javascript
vuex+axios+element-ui实现页面请求loading操作示例
2020/02/02 Javascript
JavaScript运行机制实例分析
2020/04/11 Javascript
es6函数之rest参数用法实例分析
2020/04/18 Javascript
nginx部署多个vue项目的方法示例
2020/09/06 Javascript
绘制微信小程序验证码功能的实例代码
2021/01/05 Javascript
[28:48]《真视界》- 2017年国际邀请赛
2017/09/27 DOTA
python实现对指定输入的字符串逆序输出的6种方法
2018/04/26 Python
Python 面向对象静态方法、类方法、属性方法知识点小结
2020/03/09 Python
numpy中生成随机数的几种常用函数(小结)
2020/08/18 Python
Python 多线程C段扫描、检测 Ping扫描脚本的实现
2020/09/03 Python
python3处理word文档实例分析
2020/12/01 Python
AutoShack.com加拿大:北美主要的汽车零部件零售商
2019/07/24 全球购物
C#中的验证控件有几种
2014/03/08 面试题
土木工程个人自荐信范文
2013/11/30 职场文书
党员评议表自我评价范文
2014/10/20 职场文书
酒店前台辞职书
2015/02/26 职场文书
个人优缺点总结
2015/02/28 职场文书
学习《中小学教师职业道德规范》心得体会
2016/01/18 职场文书
python中的装饰器该如何使用
2021/06/18 Python
彻底解决MySQL使用中文乱码的方法
2022/01/22 MySQL