JS实现二叉树的遍历


二叉树的遍历

二叉树的遍历指的是按照某种顺序,依次访问二叉树的每个节点,有且访问一次。

二叉树的遍历有以下三种

(1)前序遍历,从根节点,到左子树,再到右子树,简称根左右。

(2)中序遍历,从左节点,到根节点,再到右子树,简称左根右。

(3)后序遍历,从左子树,到右子树,再到根节点,简称左右根。

 

  1 <!DOCTYPE html>
  2 <html>
  3 <head>
  4     <meta charset="UTF-8">
  5     <title>Document</title>
  6     <style>
  7         *{
  8             margin: 0;
  9             padding: 0;
 10         }
 11         .wrap{
 12             display: flex;
 13             border:1px solid #000;
 14             width: 600px;
 15             margin:0 auto;
 16             height: 150px;
 17             align-items: center;
 18             justify-content:center;
 19         }
 20         .wrap div{
 21             display: flex;
 22             height: 70%;
 23             width: 44%; 
 24             margin:0 3%;
 25             border:1px solid #000;
 26             justify-content:center;
 27             align-items: center;   
 28             background: #fff;         
 29         }
 30         .btn-wrap{
 31             text-align: center;
 32             padding-top: 20px;
 33         }
 34         .btn-wrap button{
 35             display: inline-block;
 36             padding:4px 10px;
 37         }
 38         
 39     </style>
 40 </head>
 41 <body>
 42     <div class="wrap">
 43         <div>
 44             <div>
 45                 <div>
 46                     <div></div>
 47                     <div></div>
 48                 </div>
 49                 <div>
 50                     <div></div>
 51                     <div></div>
 52                 </div>
 53             </div>
 54             <div>
 55                 <div>
 56                     <div></div>
 57                     <div></div>
 58                 </div>
 59                 <div>
 60                     <div></div>
 61                     <div></div>
 62                 </div>
 63             </div>
 64         </div>
 65         <div>
 66             <div>
 67                 <div>
 68                     <div></div>
 69                     <div></div>
 70                 </div>
 71                 <div>
 72                     <div></div>
 73                     <div></div>
 74                 </div>
 75             </div>
 76             <div>
 77                 <div>
 78                     <div></div>
 79                     <div></div>
 80                 </div>
 81                 <div>
 82                     <div></div>
 83                     <div></div>
 84                 </div>
 85             </div>            
 86         </div>
 87     </div>
 88     <div class="btn-wrap"> 
 89         <button>前序</button>
 90         <button>中序</button>
 91         <button>后序</button>
 92     </div>
 93     <script>
 94         var wrap = document.querySelector(".wrap");
 95         var btn_wrap = document.querySelector(".btn-wrap");
 96         var btn1 = btn_wrap.querySelectorAll("button")[0];
 97         var btn2 = btn_wrap.querySelectorAll("button")[1];
 98         var btn3 = btn_wrap.querySelectorAll("button")[2];
 99         var arr = [];
100         var last;
101         var toggle = false;
102         //给按钮绑定事件
103         btn1.onclick = function(){
104             if(!toggle){
105                 toggle = true;
106                 reset();
107                 preOrder(wrap);
108                 showWay();
109             }
110         }
111         btn2.onclick = function(){
112             if(!toggle){
113                 toggle = true;
114                 reset();
115                 inOrder(wrap);
116                 showWay();
117             }
118         }
119         btn3.onclick = function(){
120             if(!toggle){
121                 toggle = true;
122                 reset();
123                 postOrder(wrap);
124                 showWay();
125             }
126         }
127         //二叉树的遍历的三种方式
128         //(1)前序遍历(DLR
129         function preOrder(node){
130             if(node){
131                 arr.push(node);
132                 preOrder(node.firstElementChild);
133                 preOrder(node.lastElementChild);
134             }
135         }
136         //(2)中序遍历(LDR)
137         function inOrder(node){
138             if(node){
139                 inOrder(node.firstElementChild);
140                 arr.push(node);
141                 inOrder(node.lastElementChild);
142             }
143         }
144         //(3)后序遍历(LRD)
145         function postOrder(node){
146             if(node){
147                 postOrder(node.firstElementChild);
148                 postOrder(node.lastElementChild);
149                 arr.push(node);
150             }
151         }
152         //显示遍历的过程
153         function showWay(){
154             for(var i=0; i<arr.length; i++){
155                 setTimeout(function(i){
156                     return function(){
157                         if(i == arr.length-1){
158                             toggle = false;
159                         }
160                         if(last){
161                             last.style.background = "white";
162                         }
163                         arr[i].style.background = "red";
164                         last = arr[i];
165                     }
166                 }(i),i*1000)
167             }
168         }
169         //初始化
170         function reset(){
171             arr = [];
172             if(last){
173                 last.style.background = "white";
174             }
175         }
176     </script>
177 </body>
178 </html>

Demo


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM