算法疑难(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>

浙公网安备 33010602011771号