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 相关文章推荐
Raphael带文本标签可拖动的图形实现代码
Feb 20 Javascript
jquery获得keycode的示例代码
Dec 30 Javascript
jQuery实现美观的多级动画效果菜单代码
Sep 06 Javascript
使用JavaScript判断用户输入的是否为正整数(两种方法)
Feb 05 Javascript
Vuex 入门教程
Jan 10 Javascript
使用JavaScript生成罗马字符的实例代码
Jun 08 Javascript
详解Koa中更方便简单发送响应的方式
Jul 20 Javascript
vuex页面刷新后数据丢失的方法
Jan 17 Javascript
vue的for循环使用方法
Feb 12 Javascript
浅析Vue中拆分视图层代码的5点建议
Aug 15 Javascript
jQuery 选择器用法基础入门示例
Jan 04 jQuery
JS实现动态无缝轮播
Jan 11 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
vBulletin HACK----显示话题大小和打开新窗口于论坛索引页
2006/10/09 PHP
PHP 图像尺寸调整代码
2010/05/26 PHP
PHP加密解密类实例分析
2015/04/20 PHP
ThinkPHP控制器详解
2015/07/27 PHP
javascript 写类方式之十
2009/07/05 Javascript
js控制滚动条缓慢滚动到顶部实现代码
2013/03/20 Javascript
基于jQuery插件实现环形图标菜单旋转切换特效
2015/05/15 Javascript
基于jQuery实现的QQ表情插件
2015/08/25 Javascript
分享10个优化代码的CSS和JavaScript工具
2016/05/11 Javascript
AngularJs实现分页功能不带省略号的代码
2016/05/30 Javascript
jQuery子元素过滤选择器用法示例
2016/09/09 Javascript
bootstrap读书笔记之CSS组件(上)
2016/10/17 Javascript
详解js中Json的语法与格式
2016/11/22 Javascript
详解使用vue-admin-template的优化历程
2018/05/20 Javascript
详解JavaScript事件循环机制
2018/09/07 Javascript
python常见数制转换实例分析
2015/05/09 Python
在Python中处理字符串之isdigit()方法的使用
2015/05/18 Python
Python实现简单截取中文字符串的方法
2015/06/15 Python
Python爬虫爬取一个网页上的图片地址实例代码
2018/01/16 Python
python 定义给定初值或长度的list方法
2018/06/23 Python
对python实时得到鼠标位置的示例讲解
2018/10/14 Python
利用python脚本如何简化jar操作命令
2019/02/24 Python
python使用paramiko模块通过ssh2协议对交换机进行配置的方法
2019/07/25 Python
Ubuntu下Python+Flask分分钟搭建自己的服务器教程
2019/11/19 Python
Python气泡提示与标签的实现
2020/04/01 Python
如何更换python默认编辑器的背景色
2020/08/10 Python
Kipling意大利官网:世界著名的时尚休闲包袋品牌
2019/06/05 全球购物
电影T恤、80年代T恤和80年代服装:TV Store Online
2020/01/05 全球购物
酒店副总经理岗位职责范本
2014/02/04 职场文书
2015年元旦文艺汇演主持词
2014/03/26 职场文书
应届大专毕业生自我鉴定
2014/04/08 职场文书
公司踏青活动方案
2014/08/16 职场文书
2014年党员加强作风建设思想汇报
2014/09/15 职场文书
房屋财产继承协议书范本
2014/11/03 职场文书
小兵张嘎观后感300字
2015/06/03 职场文书
2015年学校综合治理工作总结
2015/07/20 职场文书