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 相关文章推荐
游戏人文件夹程序 ver 4.03
Jul 14 Javascript
解放web程序员的输入验证
Oct 06 Javascript
鼠标经过的文本框textbox变色
May 21 Javascript
防止页面被iframe(兼容IE,Firefox火狐)
Jul 04 Javascript
jquery ajax的success回调函数中实现按钮置灰倒计时
Nov 19 Javascript
Bootstrap按钮功能之查询按钮和重置按钮
Oct 26 Javascript
详解微信小程序——自定义圆形进度条
Dec 29 Javascript
基于jQuery实现的单行公告活动轮播效果
Aug 23 jQuery
如何让你的JS代码更好看易读
Dec 01 Javascript
在vue中读取本地Json文件的方法
Sep 06 Javascript
js实现3D照片墙效果
Oct 28 Javascript
vue 动态创建组件的两种方法
Dec 31 Vue.js
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(1)
2006/10/09 PHP
强烈推荐:php.ini中文版(2)
2006/10/09 PHP
php中获得视频时间总长度的另一种方法
2011/09/15 PHP
PHP常见加密函数用法示例【crypt与md5】
2019/01/27 PHP
Jquery:ajax实现翻页无刷新功能代码
2013/08/05 Javascript
深入理解javascript动态插入技术
2013/11/12 Javascript
js变形金刚文字特效代码分享
2015/08/20 Javascript
基于jquery实现图片相关操作(重绘、获取尺寸、调整大小、缩放)
2015/12/25 Javascript
javascript中不易分清的slice,splice和split三个函数
2016/03/29 Javascript
Bootstrap实现input控件失去焦点时验证
2016/08/04 Javascript
微信小程序 页面传参实例详解
2016/11/16 Javascript
nodejs搭建本地服务器并访问文件的方法
2017/03/03 NodeJs
AngularJS 监听变量变化的实现方法
2018/10/09 Javascript
VUE2.0 ElementUI2.0表格el-table自适应高度的实现方法
2018/11/28 Javascript
JavaScript面试技巧之数组的一些不low操作
2019/03/22 Javascript
node将geojson转shp返回给前端的实现方法
2019/05/29 Javascript
Vue项目中使用better-scroll实现菜单映射功能方法
2019/09/11 Javascript
详解React的回调渲染模式
2020/09/10 Javascript
如何手写简易的 Vue Router
2020/10/10 Javascript
JavaScript实现网页计算器功能
2020/10/29 Javascript
pandas数据预处理之dataframe的groupby操作方法
2018/04/13 Python
PyQt5每天必学之像素图控件QPixmap
2018/04/19 Python
Python利用正则表达式实现计算器算法思路解析
2018/04/25 Python
Python函数基本使用原理详解
2020/03/19 Python
Python延迟绑定问题原理及解决方案
2020/08/04 Python
css3让div随鼠标移动而抖动起来
2014/02/10 HTML / CSS
澳大利亚首个在线预订旅游网站:Wotif
2017/07/19 全球购物
Stefania Mode美国:奢华设计师和时尚服装
2018/01/07 全球购物
西雅图电动自行车公司:Rad Power Bikes
2020/02/02 全球购物
新闻记者实习自我鉴定
2013/09/19 职场文书
自考毕业自我鉴定
2014/03/18 职场文书
幼儿园教师自我鉴定
2014/03/20 职场文书
竞选学习委员演讲稿
2014/04/28 职场文书
初中生300字旷课检讨书
2014/11/19 职场文书
2015年维修工作总结
2015/04/25 职场文书
二审答辩状格式
2015/05/22 职场文书