微信扫一扫打赏支持

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

 

 

 

 

 

 

 
posted @ 2020-05-23 20:15  范仁义  阅读(703)  评论(0编辑  收藏  举报