JavaScript实现二叉树的先序、中序及后序遍历方法详解


Posted in Javascript onOctober 26, 2017

本文实例讲述了JavaScript实现二叉树的先序、中序及后序遍历方法。分享给大家供大家参考,具体如下:

之前学数据结构的时候,学了二叉树的先序、中序、后序遍历的方法,并用C语言实现了,下文是用js实现二叉树的3种遍历,并以动画的形式展现出遍历的过程。

整个遍历过程还是采用递归的思想,原理很粗暴也很简单

先序遍历的函数:

function preOrder(node){
  if(!(node==null)){
    divList.push(node);
    preOrder(node.firstElementChild);
    preOrder(node.lastElementChild);
  }
}

中序遍历的函数:

function inOrder(node) {
  if (!(node == null)) {
    inOrder(node.firstElementChild);
    divList.push(node);
    inOrder(node.lastElementChild);
  }
}

后序遍历的函数:

function postOrder(node) {
  if (!(node == null)) {
    postOrder(node.firstElementChild);
    postOrder(node.lastElementChild);
    divList.push(node);
  }
}

颜色变化函数:

function changeColor(){
  var i=0;
  divList[i].style.backgroundColor = 'blue';
  timer=setInterval(function(argument){
    i++;
    if(i<divList.length){
      divList[i-1].style.backgroundColor="#fff";
      divList[i].style.backgroundColor="blue";
    }
    else{
      divList[divList.length-1].style.backgroundColor="#fff";
    }
  },500)
}

核心代码如上,本来想写深度优先遍历和广度优先遍历。后来发现二叉树深度优先遍历和先序遍历相同。改日总结一下树的BFS和DFS。

全部代码如下:

<!DOCTYPE html>
<html>
<head lang="en">
  <meta charset="UTF-8">
  <title></title>
  <style>
    .root{
      display: flex;
      padding: 20px;
      width: 1000px;
      height: 300px;border: 1px solid #000000;
      margin: 100px auto;
      margin-bottom: 10px;
      justify-content: space-between;
    }
    .child_1{
      display: flex;
      padding: 20px;
      width: 450px;
      height: 260px;border: 1px solid red;
      justify-content: space-between;
    }
    .child_2{
      display: flex;
      padding: 20px;
      width: 170px;
      height: 220px;border: 1px solid green;
      justify-content: space-between;
    }
    .child_3{
      display: flex;
      padding: 20px;
      width: 35px;
      height: 180px;border: 1px solid blue;
      justify-content: space-between;
    }
    input{
      margin-left: 100px;
      width: 60px;
      height: 40px;
      font:20px italic;
    }
  </style>
</head>
<body>
<div class="root">
  <div class="child_1">
    <div class="child_2">
      <div class="child_3"></div>
      <div class="child_3"></div>
    </div>
    <div class="child_2">
      <div class="child_3"></div>
      <div class="child_3"></div>
    </div>
  </div>
  <div class="child_1">
    <div class="child_2">
      <div class="child_3"></div>
      <div class="child_3"></div>
    </div>
    <div class="child_2">
      <div class="child_3"></div>
      <div class="child_3"></div>
    </div>
  </div>
</div>
<input type="button" value="先序">
<input type="button" value="中序">
<input type="button" value="后序">
<script type="text/javascript" src="遍历.js"></script>
</body>
</html>

js:

/**
 * Created by hp on 2016/12/22.
 */
var btn = document.getElementsByTagName('input'),
  preBtn = btn[0],
  inBtn = btn[1],
  postBtn = btn[2],
  treeRoot = document.getElementsByClassName('root')[0],
  divList = [],
  timer = null;
window.onload=function(){
  preBtn.onclick = function () {
    reset();
    preOrder(treeRoot);
    changeColor();
  }
  inBtn.onclick = function () {
    reset();
    inOrder(treeRoot);
    changeColor();
  }
  postBtn.onclick = function () {
    reset();
    postOrder(treeRoot);
    changeColor();
  }
}
/*先序遍历*/
function preOrder(node){
  if(!(node==null)){
    divList.push(node);
    preOrder(node.firstElementChild);
    preOrder(node.lastElementChild);
  }
}
/*中序遍历*/
function inOrder(node) {
  if (!(node == null)) {
    inOrder(node.firstElementChild);
    divList.push(node);
    inOrder(node.lastElementChild);
  }
}
/*后序遍历*/
function postOrder(node) {
  if (!(node == null)) {
    postOrder(node.firstElementChild);
    postOrder(node.lastElementChild);
    divList.push(node);
  }
}
/*颜色变化函数*/
function changeColor(){
  var i=0;
  divList[i].style.backgroundColor = 'blue';
  timer=setInterval(function(argument){
    i++;
    if(i<divList.length){
      divList[i-1].style.backgroundColor="#fff";
      divList[i].style.backgroundColor="blue";
    }
    else{
      divList[divList.length-1].style.backgroundColor="#fff";
    }
  },500)
}
function reset(){
  divList=[];
  clearInterval(timer);
  var divs=document.getElementsByTagName("div");
  for(var i=0;i<divs.length;i++){
    divs[i].style.backgroundColor="#fff";
  }
}

由此可见,二叉树的遍历思想是一样的。之前一直把JS看做是写各种特效的语言,现在向来是too naive了。

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
document.designMode的功能与使用方法介绍
Nov 22 Javascript
js 单引号 传递方法
Jun 22 Javascript
javascript中键盘事件用法实例分析
Jan 30 Javascript
理解Javascript的call、apply
Dec 16 Javascript
javaScript给元素添加多个class的简单实现
Jul 20 Javascript
关于axios返回空对象的问题解决
Apr 04 Javascript
基于jQuery Easyui实现登陆框界面
Jul 10 jQuery
javascript兼容性(实例讲解)
Aug 15 Javascript
Vue官方文档梳理之全局配置
Nov 22 Javascript
JavaScript中toLocaleString()和toString()的区别实例分析
Aug 14 Javascript
React精髓!一篇全概括小结(急速)
May 23 Javascript
简单谈谈javascript高级特性
Sep 04 Javascript
JavaScript实现树的遍历算法示例【广度优先与深度优先】
Oct 26 #Javascript
详述 Sublime Text 打开 GBK 格式中文乱码的解决方法
Oct 26 #Javascript
node.js的exports、module.exports与ES6的export、export default深入详解
Oct 26 #Javascript
详解Webstorm 新建.vue文件支持高亮vue语法和es6语法
Oct 26 #Javascript
Node.js中环境变量process.env的一些事详解
Oct 26 #Javascript
Sublime Text新建.vue模板并高亮(图文教程)
Oct 26 #Javascript
vue+swiper实现组件化开发的实例代码
Oct 26 #Javascript
You might like
如何在PHP中使用Oracle数据库(3)
2006/10/09 PHP
PHP 面向对象 PHP5 中的常量
2010/05/05 PHP
php无限极分类递归排序实现方法
2014/11/11 PHP
php使用数组填充下拉列表框的方法
2015/03/31 PHP
php 时间time与日期date之间的使用详解及区别
2016/11/07 PHP
Ubuntu上安装yaf扩展的方法
2018/01/29 PHP
jquery实现div阴影效果示例代码
2013/09/16 Javascript
jquery中常用的SET和GET$(”#msg”).html循环介绍
2013/10/09 Javascript
jquery用data方法获取某个元素上的事件
2014/06/23 Javascript
jQuery中height()方法用法实例
2014/12/24 Javascript
jQuery和AngularJS的区别浅析
2015/01/29 Javascript
js实现键盘上下左右键选择文字并显示在文本框的方法
2015/05/07 Javascript
js判断所有表单项不为空则提交表单的实现方法
2016/09/09 Javascript
Vue表单验证插件的制作过程
2017/04/01 Javascript
AngularJS中下拉框的基本用法示例
2017/10/11 Javascript
JS+WCF实现进度条实时监测数据加载量的方法详解
2017/12/19 Javascript
360doc网站不登录就无法复制内容的解决方法
2018/01/27 Javascript
基于Vue2实现简易的省市区县三级联动组件效果
2018/11/05 Javascript
VuePress 快速踩坑小结
2019/02/14 Javascript
JS设置自定义快捷键并实现图片上下左右移动
2019/10/17 Javascript
使用node.JS中的url模块解析URL信息
2020/02/06 Javascript
JS PHP字符串截取函数实现原理解析
2020/08/29 Javascript
py中的目录与文件判别代码
2008/07/16 Python
python脚本实现分析dns日志并对受访域名排行
2014/09/18 Python
Python3实现的字典、列表和json对象互转功能示例
2018/05/22 Python
python 对key为时间的dict排序方法
2018/10/17 Python
如何在python中实现随机选择
2019/11/02 Python
中国一家专注拼团的社交购物网站:拼多多
2018/06/13 全球购物
《阳光》教学反思
2014/02/23 职场文书
2014乡镇干部纪律作风整顿思想汇报
2014/09/13 职场文书
2014党员批评和自我批评思想汇报
2014/09/21 职场文书
公务员考察材料
2014/12/23 职场文书
2015年见习期个人工作总结
2015/05/28 职场文书
小人国观后感
2015/06/11 职场文书
教你用python控制安卓手机
2021/05/13 Python
为什么MySQL 删除表数据 磁盘空间还一直被占用
2021/10/16 MySQL