25、任务二十二——二叉树

0、题目

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

1、解答过程

  1 <!DOCTYPE html>
  2 <html>
  3   <head>
  4     <meta charset="UTF-8">
  5     <title>IFE JavaScript Task 22</title>
  6     <style>
  7         div{
  8             display: inline-block;
  9             padding:20px;
 10             margin:3px;
 11             border:1px solid black;
 12         }
 13         span{
 14             display: block;
 15         }
 16         #button{
 17             margin-top:20px;
 18         }
 19         button{
 20             margin:20px;
 21             width:100px;
 22         }
 23     </style>
 24   </head>
 25 <body>
 26     <div id="tree">
 27         <div>
 28             <div>
 29                 <div></div>
 30                 <div></div>
 31             </div>
 32             <div>
 33                 <div></div>
 34                 <div></div>
 35             </div>
 36         </div>
 37         <div>
 38             <div>
 39                 <div></div>
 40                 <div></div>
 41             </div>
 42             <div>
 43                 <div></div>
 44                 <div></div>
 45             </div>
 46         </div>
 47     </div>
 48     <span id="button">
 49         <button id="pre">前序</button>
 50         <button id="in">中序</button>
 51         <button id="post">后序</button>
 52     </span>
 53 <script>
 54 var tree=document.getElementById("tree"),
 55     list=[],
 56     timer=null;
 57 //先序遍历
 58 function preOrder(node){
 59     if(node!=null){
 60         list.push(node);
 61         preOrder(node.firstElementChild);
 62         preOrder(node.lastElementChild);
 63     }
 64 }
 65 //中序遍历
 66 function inOrder(node){
 67     if(node!=null){
 68         inOrder(node.firstElementChild);
 69         list.push(node);
 70         inOrder(node.lastElementChild);
 71     }
 72 }
 73 //后序遍历
 74 function postOrder(node){
 75     if(node!=null){
 76         postOrder(node.firstElementChild);
 77         postOrder(node.lastElementChild);
 78         list.push(node);
 79     }
 80 }
 81 //依次改变数组list中的元素背景颜色
 82 function show(){
 83     var i = 0;
 84     list[i].style.backgroundColor='blue';
 85     timer = setInterval(function () {
 86         i++;
 87         if (i < list.length) {
 88             list[i-1].style.backgroundColor = '#fff';
 89             list[i].style.backgroundColor = 'blue';
 90         } else {
 91             clearInterval(timer);
 92             list[list.length-1].style.backgroundColor = '#fff';
 93         }
 94     },500)
 95 }
 96 //使用事件委托监听按钮点击事件
 97 var button=document.getElementById("button");
 98     button.addEventListener("click",function(e){
 99         switch(e.target.id){
100             case "pre":{
101                 origin();
102                 preOrder(tree);
103                 show();
104                 break;
105             }
106             case "in":{
107                 origin();
108                 inOrder(tree);
109                 show();
110                 break;
111             }
112             case "post":{
113                 origin();
114                 postOrder(tree);
115                 show();
116                 break;
117             }
118     }
119     })
120 //复位原始状态,防止不同按钮点击事件之间的冲突
121 function origin(){
122     list=[];
123     clearInterval(timer); 
124     var divs=document.getElementsByTagName("div");
125     for(var i=0;i<divs.length;i++){   //让所有元素的背景色均恢复至白色
126         divs[i].style.backgroundColor="white";
127     }
128 }
129 </script>
130 </body>
131 </html>
原文地址:https://www.cnblogs.com/cjlalala/p/5869171.html