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脚本实现Web页面信息交互
Oct 11 Javascript
jquery实现table鼠标经过变色代码
Sep 25 Javascript
jquery 合并内容相同的单元格(示例代码)
Dec 13 Javascript
jQuery插件boxScroll实现图片轮播特效
Jul 14 Javascript
分享两段简单的JS代码防止SQL注入
Apr 12 Javascript
JS动态生成年份和月份实例代码
Feb 04 Javascript
Angular2 Service实现简单音乐播放器服务
Feb 24 Javascript
js中的面向对象入门
Mar 06 Javascript
基于JavaScript实现验证码功能
Apr 01 Javascript
微信小程序学习笔记之表单提交与PHP后台数据交互处理图文详解
Mar 28 Javascript
jstree中的checkbox默认选中和隐藏示例代码
Dec 29 Javascript
Antd下拉选择,自动匹配功能的实现
Oct 24 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使用mkdir创建多级目录的方法
2015/12/22 PHP
PHP读取目录树的实现方法分析
2019/03/22 PHP
javascript错误的认识不用关心内存管理
2012/12/15 Javascript
jQuery实现仿腾讯微博滑出效果报告每日天气的方法
2015/05/11 Javascript
JavaScript通过HTML的class来获取HTML元素的方法总结
2016/05/24 Javascript
Ionic2系列之使用DeepLinker实现指定页面URL
2016/11/21 Javascript
快速实现jQuery多级菜单效果
2017/02/01 Javascript
vue.js树形组件之删除双击增加分支实例代码
2017/02/28 Javascript
EasyUI在Panel上动态添加LinkButton按钮
2017/08/11 Javascript
详解如何在Vue里建立长按指令
2018/08/20 Javascript
[02:56]DOTA2上海特锦赛小组赛解说FreeAgain采访花絮
2016/02/27 DOTA
Python中函数参数设置及使用的学习笔记
2016/05/03 Python
Python多进程库multiprocessing中进程池Pool类的使用详解
2017/11/24 Python
python分治法求二维数组局部峰值方法
2018/04/03 Python
Python实现决策树C4.5算法的示例
2018/05/30 Python
Pandas_cum累积计算和rolling滚动计算的用法详解
2019/07/04 Python
简单了解python 邮件模块的使用方法
2019/07/24 Python
使用Python快乐学数学Github万星神器Manim简介
2019/08/07 Python
python的time模块和datetime模块实例解析
2019/11/29 Python
Python基础之函数原理与应用实例详解
2020/01/03 Python
Tensorflow:转置函数 transpose的使用详解
2020/02/11 Python
python实现在内存中读写str和二进制数据代码
2020/04/24 Python
python两个list[]相加的实现方法
2020/09/23 Python
PyCharm最新激活码(2020/10/27全网最新)
2020/10/27 Python
创业计划书——互联网商机
2014/01/12 职场文书
元旦文艺汇演主持词
2014/03/26 职场文书
节水倡议书范文
2014/04/15 职场文书
中职三好学生事迹材料
2014/08/24 职场文书
教师节学生演讲稿
2014/09/03 职场文书
小学生安全教育广播稿
2014/10/20 职场文书
幼儿园园长个人总结
2015/03/02 职场文书
导游词之海南天涯海角
2019/12/05 职场文书
Go语言-为什么返回值为接口类型,却返回结构体
2021/04/24 Golang
【海涛七七解说】DCG第二周:DK VS 天禄
2022/04/01 DOTA
docker-compose部署Yapi的方法
2022/04/08 Servers
windows11选中自动复制怎么开启? Win11自动复制所选内容的方法
2022/07/23 数码科技