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

     
  • 相关阅读:
    EditorWindow 和MenuItem
    PropertyDrawer 自定义属性绘图
    NGUI3.5系列教程之 一些小功能的实现
    NGUI3.5系列教程之 UILabel
    关于Resources.LoadAssetAtPath
    C#调用Python 脚本语言
    unity项目实现“再按一次退出程序”提示功能
    在Visual Studio 2010 中创建类库(dll)
    Unity 优化
    JAVA package-info文件【转】
  • 原文地址:https://www.cnblogs.com/Renyi-Fan/p/12940794.html
Copyright © 2020-2023  润新知