算法疑难(js实现)---9、二叉树的深度优先遍历

算法疑难(js实现)---9、二叉树的深度优先遍历

一、总结

一句话总结:

1、先序遍历:(根左右)
2、中序遍历:(左根右)
3、后序遍历:(左右根)
 1 1 2 先序遍历:(根左右)
 3 a、访问根节点(得到节点的值)
 4 b、递归的访问左子树
 5 c、递归的访问右子树
 6 
 7 2 8 中序遍历:(左根右)
 9 a、递归的访问左子树
10 b、访问根节点(得到节点的值)
11 c、递归的访问右子树
12 
13 314 后序遍历:(左右根)
15 a、递归的访问左子树
16 b、递归的访问右子树
17 c、访问根节点(得到节点的值)
18 
19 //1、先序遍历二叉树
20 function preOrderTraversal(tree,ans){
21     //递归的终止条件:叶子节点
22     //递归的递推表达式:根左右
23     //递归的返回值:不需要
24 
25     //如果不是叶子节点,就递归的访问左右子树
26     if(tree){
27         //a、访问根节点(得到节点的值)
28         //console.log(tree.val);
29         ans.push(tree.val);
30         //b、递归的访问左子树
31         preOrderTraversal(tree.left,ans);
32         //c、递归的访问右子树
33         preOrderTraversal(tree.right,ans);
34     }else{
35         //console.log('#');
36         ans.push('#');
37     }
38 }
39 let ans=[];
40 preOrderTraversal(tree,ans);
41 console.log(ans);
42 
43 //2、中序遍历二叉树
44 function inOrderTraversal(tree,ans){
45     if(tree){
46         //a、递归的访问左子树
47         inOrderTraversal(tree.left,ans);
48         //b、访问根节点(得到节点的值)
49         ans.push(tree.val);
50         //c、递归的访问右子树
51         inOrderTraversal(tree.right,ans);
52     }else{
53         ans.push('#');
54     }
55 }
56 
57 //3、后序遍历二叉树
58 function postOrderTraversal(tree,ans){
59     if(tree){
60         //a、递归的访问左子树
61         postOrderTraversal(tree.left,ans);
62         //b、递归的访问右子树
63         postOrderTraversal(tree.right,ans);
64         //c、访问根节点(得到节点的值)
65         ans.push(tree.val);
66     }else{
67         ans.push('#');
68     }
69 }

二、二叉树的深度优先遍历

博客对应课程的视频位置:9、二叉树的深度优先遍历
https://www.fanrenyi.com/video/20/245

  1 <!DOCTYPE html>
  2 <html lang="en">
  3 <head>
  4     <meta charset="UTF-8">
  5     <title>二叉树的深度优先遍历</title>
  6 </head>
  7 <body>
  8 <!--
  9 需求:
 10 先序、中序、后序三种方式遍历二叉树
 11                 a
 12             b       c
 13          d     #  #    e
 14        #   f         #    #
 15          #   #
 16 
 17 先序遍历序列:['a','b','d','#','f','#','#','#','c','#','e','#','#']
 18 中序遍历序列:["#","d","#","f","#","b","#","a","#","c","#","e","#"]
 19 后序遍历序列:["#","#","#","f","d","#","b","#","#","#","e","c","a"]
 20 
 21 算法:
 22 递归
 23 
 24 1、
 25 先序遍历:(根左右)
 26 a、访问根节点(得到节点的值)
 27 b、递归的访问左子树
 28 c、递归的访问右子树
 29 
 30 2、
 31 中序遍历:(左根右)
 32 a、递归的访问左子树
 33 b、访问根节点(得到节点的值)
 34 c、递归的访问右子树
 35 
 36 3、
 37 后序遍历:(左右根)
 38 a、递归的访问左子树
 39 b、递归的访问右子树
 40 c、访问根节点(得到节点的值)
 41 
 42 -->
 43 <script>
 44     function TreeNode(val){
 45         this.val=val;
 46         this.left=null;
 47         this.right=null;
 48     }
 49 
 50     //根据二叉树的层次遍历的序列结果,创建二叉树
 51     function createTree_levelOrder(levelOrderArr) {
 52         let queue=[];
 53         let root=null;
 54 
 55         if(levelOrderArr[0]!==undefined){
 56             //1、找到根节点,将根节点加入到队列(层次遍历结果序列的第一个一定是根节点)
 57             let nodeVal=levelOrderArr.shift();
 58             root=new TreeNode(nodeVal);
 59             queue.push(root);
 60 
 61             //2、循环的将队列队首的元素出队,把和出队元素相关的元素加入到队列(循环中的元素为空,循环就运行完了)
 62 
 63             //队列不为空
 64             while(queue.length){
 65                 //1、将队列队首的元素出队(要么是整棵树的根节点、要么是子树的根节点)
 66                 let head= queue.shift();
 67                 //2、把和出队元素相关的元素加入到队列(先创建节点,根节点的左右孩子)
 68                 //a、创建左节点,将它加入到队列
 69                 nodeVal=levelOrderArr.shift();
 70                 if(nodeVal!='#'){
 71                     head.left=new TreeNode(nodeVal);
 72                     queue.push(head.left);
 73                 }
 74 
 75                 //b、创建右节点,将它加入到队列
 76                 nodeVal=levelOrderArr.shift();
 77                 if(nodeVal!='#'){
 78                     head.right=new TreeNode(nodeVal);
 79                     queue.push(head.right);
 80                 }
 81             }
 82         }
 83 
 84         return root;
 85     }
 86     let levelOrderArr=['a','b','c','d','#','#','e','#','f','#','#','#','#'];
 87     let tree=createTree_levelOrder(levelOrderArr);
 88     console.log(tree);
 89 
 90     // //1、先序遍历二叉树
 91     // function preOrderTraversal(tree,ans){
 92     //     //递归的终止条件:叶子节点
 93     //     //递归的递推表达式:根左右
 94     //     //递归的返回值:不需要
 95     //
 96     //     //如果不是叶子节点,就递归的访问左右子树
 97     //     if(tree){
 98     //         //a、访问根节点(得到节点的值)
 99     //         //console.log(tree.val);
100     //         ans.push(tree.val);
101     //         //b、递归的访问左子树
102     //         preOrderTraversal(tree.left,ans);
103     //         //c、递归的访问右子树
104     //         preOrderTraversal(tree.right,ans);
105     //     }else{
106     //         //console.log('#');
107     //         ans.push('#');
108     //     }
109     // }
110     // let ans=[];
111     // preOrderTraversal(tree,ans);
112     // console.log(ans);
113 
114     // //2、中序遍历二叉树
115     // function inOrderTraversal(tree,ans){
116     //     if(tree){
117     //         //a、递归的访问左子树
118     //         inOrderTraversal(tree.left,ans);
119     //         //b、访问根节点(得到节点的值)
120     //         ans.push(tree.val);
121     //         //c、递归的访问右子树
122     //         inOrderTraversal(tree.right,ans);
123     //     }else{
124     //         ans.push('#');
125     //     }
126     // }
127     // let ans=[];
128     // inOrderTraversal(tree,ans);
129     // console.log(ans);
130 
131     //3、后序遍历二叉树
132     function postOrderTraversal(tree,ans){
133         if(tree){
134             //a、递归的访问左子树
135             postOrderTraversal(tree.left,ans);
136             //b、递归的访问右子树
137             postOrderTraversal(tree.right,ans);
138             //c、访问根节点(得到节点的值)
139             ans.push(tree.val);
140         }else{
141             ans.push('#');
142         }
143     }
144     let ans=[];
145     postOrderTraversal(tree,ans);
146     console.log(ans);
147 
148 </script>
149 </body>
150 </html>

 
原文地址:https://www.cnblogs.com/Renyi-Fan/p/12944547.html