微信扫一扫打赏支持

算法疑难(js实现)---7、二叉树的创建(层次遍历)

算法疑难(js实现)---7、二叉树的创建(层次遍历)

一、总结

一句话总结:

层次遍历的问题一般用队列解决
function TreeNode(val){
    this.val=val;
    this.left=null;
    this.right=null;
}

//根据二叉树的层次遍历的序列结果,创建二叉树
function createTree_levelOrder(levelOrderArr) {
    let queue=[];
    let root=null;

    if(levelOrderArr[0]!==undefined){
        //1、找到根节点,将根节点加入到队列(层次遍历结果序列的第一个一定是根节点)
        let nodeVal=levelOrderArr.shift();
        root=new TreeNode(nodeVal);
        queue.push(root);

        //2、循环的将队列队首的元素出队,把和出队元素相关的元素加入到队列(循环中的元素为空,循环就运行完了)

        //队列不为空
        while(queue.length){
            //1、将队列队首的元素出队(要么是整棵树的根节点、要么是子树的根节点)
            let head= queue.shift();
            //2、把和出队元素相关的元素加入到队列(先创建节点,根节点的左右孩子)
            //a、创建左节点,将它加入到队列
            nodeVal=levelOrderArr.shift();
            if(nodeVal!='#'){
                head.left=new TreeNode(nodeVal);
                queue.push(head.left);
            }

            //b、创建右节点,将它加入到队列
            nodeVal=levelOrderArr.shift();
            if(nodeVal!='#'){
                head.right=new TreeNode(nodeVal);
                queue.push(head.right);
            }
        }
    }

    return root;
}

 

 

1、队列解决问题的算法模板?

当队列不为空的时候,循环的将队列队首的元素出队,把和出队元素相关的元素加入到队列
while(队列不为空){
    1、将队列队首的元素出队
    2、把和出队元素相关的元素加入到队列
}

 

 

2、在取或者用节点之前,为什么一定要判断节点是否存在?

因为这样可以避免很多错误,无论是在算法题中,还是在日常的开发中操作数据库,都是先判断数据是否存在,然后取数据进行增删改等操作

 

 

 

二、二叉树的创建(层次遍历)

博客对应课程的视频位置:7、二叉树的创建(层次遍历)
https://www.fanrenyi.com/video/20/243

 

 

 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 例如
12 层次遍历结果为:['a','b','c','d','#','#','e','#','f','#','#','#','#']
13 对应的二叉树为
14                 a
15             b       c
16          d     #  #    e
17        #   f         #    #
18          #   #
19 
20 算法思路
21 用队列
22 
23 算法步骤:
24 1、找到根节点,将根节点加入到队列(层次遍历结果序列的第一个一定是根节点)
25 2、循环的将队列队首的元素出队,把和出队元素相关的元素加入到队列(循环中的元素为空,循环就运行完了)
26 
27 队列解决问题的算法模板
28 while(队列不为空){
29     1、将队列队首的元素出队
30     2、把和出队元素相关的元素加入到队列
31 }
32 
33 队列解决问题的算法模板(队列解决根据二叉树的层次遍历的序列结果,创建二叉树)
34 while(队列不为空){
35     1、将队列队首的元素出队(要么是整棵树的根节点、要么是子树的根节点)
36     2、把和出队元素相关的元素加入到队列(根节点的左右孩子)
37 }
38 
39 注意点:
40 树的叶子节点不用加入到队列中
41 
42 在js中,用数组模拟队列特别方面
43 shift方法(出队),push方法(入队)
44 
45 -->
46 <script>
47     function TreeNode(val){
48         this.val=val;
49         this.left=null;
50         this.right=null;
51     }
52 
53     //根据二叉树的层次遍历的序列结果,创建二叉树
54     function createTree_levelOrder(levelOrderArr) {
55         let queue=[];
56         let root=null;
57 
58         if(levelOrderArr[0]!==undefined){
59             //1、找到根节点,将根节点加入到队列(层次遍历结果序列的第一个一定是根节点)
60             let nodeVal=levelOrderArr.shift();
61             root=new TreeNode(nodeVal);
62             queue.push(root);
63 
64             //2、循环的将队列队首的元素出队,把和出队元素相关的元素加入到队列(循环中的元素为空,循环就运行完了)
65 
66             //队列不为空
67             while(queue.length){
68                 //1、将队列队首的元素出队(要么是整棵树的根节点、要么是子树的根节点)
69                 let head= queue.shift();
70                 //2、把和出队元素相关的元素加入到队列(先创建节点,根节点的左右孩子)
71                 //a、创建左节点,将它加入到队列
72                 nodeVal=levelOrderArr.shift();
73                 if(nodeVal!='#'){
74                     head.left=new TreeNode(nodeVal);
75                     queue.push(head.left);
76                 }
77 
78                 //b、创建右节点,将它加入到队列
79                 nodeVal=levelOrderArr.shift();
80                 if(nodeVal!='#'){
81                     head.right=new TreeNode(nodeVal);
82                     queue.push(head.right);
83                 }
84             }
85         }
86 
87         return root;
88     }
89     let levelOrderArr=['a','b','c','d','#','#','e','#','f','#','#','#','#'];
90     let tree=createTree_levelOrder(levelOrderArr);
91     console.log(tree);
92 </script>
93 </body>
94 </html>

 

 
posted @ 2020-05-22 23:43  范仁义  阅读(699)  评论(0)    收藏  举报