zoukankan      html  css  js  c++  java
  • 算法疑难(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>

     
  • 相关阅读:
    Flutter form 的表单 input
    FloatingActionButton 实现类似 闲鱼 App 底部导航凸起按钮
    Flutter 中的常见的按钮组件 以及自 定义按钮组件
    Drawer 侧边栏、以及侧边栏内 容布局
    AppBar 自定义顶部导航按钮 图标、颜色 以及 TabBar 定义顶部 Tab 切换 通过TabController 定义TabBar
    清空路由 路由替换 返回到根路由
    应对ubuntu linux图形界面卡住的方法
    [转] 一块赚零花钱
    [转]在树莓派上搭建LAMP服务
    ssh保持连接
  • 原文地址:https://www.cnblogs.com/Renyi-Fan/p/12940794.html
Copyright © 2011-2022 走看看