算法疑难(js实现)---8、二叉树的创建(先序遍历)
算法疑难(js实现)---8、二叉树的创建(先序遍历)
一、总结
一句话总结:
先序遍历结果创建二叉树,只需要把先序遍历算法步骤中的访问改成创建 就是 根据先序遍历结果创建二叉树的算法,具体先创建根节点,再递归的创建左子树,再递归的创建右子树
2、算法步骤(根据一个树的先序遍历的结果,创建二叉树) (1)依次取到先序序列的头部的值a (2) a、创建根节点(根节点的值就是取到的值a) b、递归创建左子树 c、递归创建右子树 3、先序遍历(根左右) a、访问根节点(得到节点的值) b、递归的访问左子树 c、递归的访问右子树 function TreeNode(val){ this.val=val; this.left=null; this.right=null; } //根据一个二叉树的先序遍历的结果,创建二叉树 function createTree_preOrder(preOrderArr){ //a、递归的结束条件:叶子节点 //b、递归的递推表达式(节点之间的关系):根左右 //c、递归的返回值:创建好的树或者子树 let root=null; if(preOrderArr[0]!==undefined){ //(1)拿到先序序列 的头部的值a let nodeVal=preOrderArr.shift(); //不是叶子节点,才有必要进行创建子树的操作 if(nodeVal!='#'){ //(2) //a、创建根节点(需要节点的值:就是值啊) root=new TreeNode(nodeVal); //b、递归的创建左子树 root.left=createTree_preOrder(preOrderArr); //c、递归的创建右子树 root.right=createTree_preOrder(preOrderArr); } } return root; } let preOrderArr=['a','b','d','#','f','#','#','#','c','#','e','#','#']; let tree=createTree_preOrder(preOrderArr); console.log(tree);
1、递归的注意事项(具体是 根据一个二叉树的先序遍历的结果,创建二叉树)?
a、递归的结束条件:叶子节点
b、递归的递推表达式(节点之间的关系):根左右
c、递归的返回值:创建好的树或者子树
二、二叉树的创建(先序遍历)
博客对应课程的视频位置:8、二叉树的创建(先序遍历)
https://www.fanrenyi.com/video/20/244
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','d','#','f','#','#','#','c','#','e','#','#'] 13 对应的二叉树: 14 a 15 b c 16 d # # e 17 # f # # 18 # # 19 20 1、算法思路 21 递归 22 23 2、算法步骤:根据一个二叉树的先序遍历的结果,创建二叉树 24 (1)拿到先序序列 的头部的值a 25 (2) 26 a、创建根节点(需要节点的值:就是值啊) 27 b、递归的创建左子树 28 c、递归的创建右子树 29 30 31 3、先序遍历(根左右) 32 a、访问根节点(得到节点的值) 33 b、递归的访问左子树 34 c、递归的访问右子树 35 36 遇到的节点的顺序和数量是完全一样的 37 38 a、创建根节点(需要节点的值) 39 b、递归的创建左子树 40 c、递归的创建右子树 41 42 4、递归的注意事项 43 a、递归的结束条件:叶子节点 44 b、递归的递推表达式(节点之间的关系):根左右 45 c、递归的返回值:创建好的树或者子树 46 47 --> 48 <script> 49 function TreeNode(val){ 50 this.val=val; 51 this.left=null; 52 this.right=null; 53 } 54 55 //根据一个二叉树的先序遍历的结果,创建二叉树 56 function createTree_preOrder(preOrderArr){ 57 //a、递归的结束条件:叶子节点 58 //b、递归的递推表达式(节点之间的关系):根左右 59 //c、递归的返回值:创建好的树或者子树 60 let root=null; 61 if(preOrderArr[0]!==undefined){ 62 //(1)拿到先序序列 的头部的值a 63 let nodeVal=preOrderArr.shift(); 64 65 //不是叶子节点,才有必要进行创建子树的操作 66 if(nodeVal!='#'){ 67 //(2) 68 //a、创建根节点(需要节点的值:就是值啊) 69 root=new TreeNode(nodeVal); 70 //b、递归的创建左子树 71 root.left=createTree_preOrder(preOrderArr); 72 //c、递归的创建右子树 73 root.right=createTree_preOrder(preOrderArr); 74 } 75 } 76 return root; 77 } 78 let preOrderArr=['a','b','d','#','f','#','#','#','c','#','e','#','#']; 79 let tree=createTree_preOrder(preOrderArr); 80 console.log(tree); 81 </script> 82 </body> 83 </html>
版权申明:欢迎转载,但请注明出处
一些博文中有一些参考内容因时间久远找不到来源了没有注明,如果侵权请联系我删除。
在校每年国奖、每年专业第一,加拿大留学,先后工作于华东师范大学和香港教育大学。
2024-10-30:27岁,宅加太忙,特此在网上找女朋友,坐标上海,非诚勿扰,vx:fan404006308
AI交流资料群:753014672