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 相关文章推荐
JavaScript Tips 使用DocumentFragment加快DOM渲染速度
Jun 28 Javascript
FileUpload上传图片(图片不变形)
Aug 05 Javascript
浅析IE10兼容性问题(frameset的cols属性)
Jan 03 Javascript
如何编写高质量JS代码(续)
Feb 25 Javascript
JS实现文件动态顺序载入的方法
Mar 07 Javascript
AngularJS实现Model缓存的方式
Feb 03 Javascript
jQuery简单动画变换效果实例分析
Jul 04 Javascript
js实现倒计时效果(小于10补零)
Mar 08 Javascript
js实现图片轮播效果学习笔记
Jul 26 Javascript
使用node.js实现微信小程序实时聊天功能
Aug 13 Javascript
vue 获取到数据但却渲染不到页面上的解决方法
Nov 19 Vue.js
可拖拽组件slider.js使用方法详解
Dec 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用正则表达式匹配中文实例详解
2013/11/06 PHP
php文件上传的例子及参数详解
2013/12/12 PHP
PHP制作图形验证码代码分享
2014/10/23 PHP
php根据生日计算年龄的方法
2015/07/13 PHP
初识ThinkPHP控制器
2016/04/07 PHP
java微信开发之上传下载多媒体文件
2016/06/24 PHP
JavaScript asp.net 获取当前超链接中的文本
2009/04/14 Javascript
JS 跳转页面延迟2种方法
2013/03/29 Javascript
Jquery遍历节点的方法小集
2014/01/22 Javascript
js设置文本框中焦点位置在最后的示例代码(简单实用)
2014/03/04 Javascript
js判断用户是输入的地址请求的路径(实例讲解)
2017/07/18 Javascript
深入浅出webpack教程系列_安装与基本打包用法和命令参数详解
2017/09/10 Javascript
JS中的多态实例详解
2017/10/15 Javascript
基于 Vue 实现一个酷炫的 menu插件
2017/11/14 Javascript
jQuery的Ajax接收java返回数据方法
2018/08/11 jQuery
JS前端知识点总结之内置对象,日期对象和定时器相关操作
2019/07/05 Javascript
使用vue-router切换页面时实现设置过渡动画
2019/10/31 Javascript
如何在JavaScript中创建具有多个空格的字符串?
2020/02/23 Javascript
vue created钩子函数与mounted钩子函数的用法区别
2020/11/05 Javascript
[43:35]TI4 循环赛第二日Liquid vs Fnatic
2014/07/11 DOTA
调试Python程序代码的几种方法总结
2015/04/28 Python
Python简单遍历字典及删除元素的方法
2016/09/18 Python
python实现flappy bird小游戏
2018/12/24 Python
selenium+python自动化测试之环境搭建
2019/01/23 Python
Python字符串内置函数功能与用法总结
2019/04/16 Python
np.random.seed() 的使用详解
2020/01/14 Python
Python reversed函数及使用方法解析
2020/03/17 Python
Python GUI编程学习笔记之tkinter中messagebox、filedialog控件用法详解
2020/03/30 Python
利用Python实现某OA系统的自动定位功能
2020/05/27 Python
详解Html5 监听拦截Android返回键方法
2018/04/18 HTML / CSS
澳大利亚游乐场设备品牌:Lifespan Kids
2019/05/24 全球购物
奥林匹亚体育:Olympia Sports
2020/12/30 全球购物
如何使用PHP session
2015/04/21 面试题
土木工程专业个人求职信
2013/12/05 职场文书
超详细教你怎么升级Mysql的版本
2021/05/19 MySQL
七个非常实用的Python工具包总结
2021/06/15 Python