supce's blog

IFE Task 09


任务目的

  • 熟练JavaScript
  • 学习树这种数据结构的基本知识

任务描述

  • 在页面中展现一颗二叉树的结构
  • 提供一个按钮,显示开始遍历,点击后,以动画的形式呈现遍历的过程
  • 二叉树的遍历算法和方式自定,前序中序后序皆可,但推荐可以提供多种算法的展示
  • 增加多个按钮,每个按钮对应不同的算法)
  • 当前被遍历到的节点做一个特殊显示(比如不同的颜色)
  • 每隔一段时间(500ms,1s等时间自定)再遍历下一个节点

整体思路

二叉树还是容易的,直接利用div在页面展现一个二叉树结构,然后放上三个变量按钮

<div id="tree_wrap">
    <div>
        <div>
            <div></div>
            <div></div>
        </div>
        <div>
            <div></div>
            <div></div>
        </div>
    </div>
    <div>
        <div>
            <div></div>
            <div></div>
        </div>
        <div>
            <div></div>
            <div></div>
        </div>
    </div>
</div>
<button id="dlr">前序遍历</button>
<button id="ldr">中序遍历</button>
<button id="lrd">后序遍历</button>

由于题目要求能够对遍历可视化,这里就把遍历后的节点保存在一个数组中,这样既记录了节点,又保存了节点的变量顺序,最后对数组进行可视化遍历即可。

首先给button添加点击事件

//根据不同的按钮调用不同的排序算法
function btnHandle(){
    var id = event.target.id;
    var tree = $("tree_wrap");
    switch(id){
        case 'dlr':
            dlr(tree);
            break;
        case 'ldr':
            ldr(tree);
            break;
        case 'lrd':
            lrd(tree);
            break;
    }
    renderData();
}
function init(){
    var btns = document.getElementsByTagName("button");
    for(var i=0;i<btns.length;i++){
        addHandler(btns[i],"click",btnHandle);
    }
}
init();

用递归把三种遍历函数写出来

//前序遍历
function dlr(node){
    if(node){
        nodeArray.push(node);
        dlr(node.firstElementChild);
        dlr(node.lastElementChild);
    }
}
//中序遍历
function ldr(node){
    if(node){
        ldr(node.firstElementChild);
        nodeArray.push(node);
        ldr(node.lastElementChild);
    }
}
//后序遍历
function lrd(node){
    if(node){
        lrd(node.firstElementChild);
        lrd(node.lastElementChild);
        nodeArray.push(node);
    }
}

最后利用 setInterval 函数把遍历过程渲染出来,这里可以写一个renderData函数

//存储遍历后的节点
var nodeArray = [];
//渲染数据
function renderData(){
    var timer = null,i=0;
    timer =setInterval(run,500);
    function run(){
        if(i<nodeArray.length){
            if(i-1 > -1){
                //清除上一个节点的背景色
                nodeArray[i-1].className = "";
            }
            nodeArray[i].className = "selected";
            i++;
        }else{
            //清除最一个节点的背景色
            nodeArray[i-1].className = "";
            clearInterval(timer);
            nodeArray = [];
            return;
        }
    }
    console.log(nodeArray);
}

最终代码

最终代码
演示效果