zoukankan      html  css  js  c++  java
  • 算法疑难(js实现)---2、重建二叉树

    算法疑难(js实现)---2、重建二叉树

    一、总结

    一句话总结:

    1、找到根节点(前序序列的第一个元素一定是根节点)
    2、根据找到的根节点和中序序列,找到树的左子树和右子树
    3、让左子树和右子树进行1、2步的递归操作,来构建左子树和右子树
    function rebuildTree(qianXu,zhongXu){
        if(qianXu[0]){
            //1、找到根节点(前序序列的第一个元素一定是根节点)
            let rootVal=qianXu[0];//根节点的值
    
            //2、根据找到的根节点和中序序列,找到树的左子树和右子树
            //根节点在中序序列中的位置
            let index=zhongXu.indexOf(rootVal);
    
            //前序序列:左子树qianXu(1,index),右子树qianXu(index+1,最后)
            //中序序列:左子树zhongXu(0,index-1),右子树zhongXu(index+1,最后)
    
    
            //3、让左子树和右子树进行1、2步的递归操作,来构建左子树和右子树
            let leftTree=rebuildTree(qianXu.slice(1,index+1),zhongXu.slice(0,index));
            let rightTree=rebuildTree(qianXu.slice(index+1),zhongXu.slice(index+1));
    
            let root=new TreeNode(rootVal);
            root.left=leftTree;
            root.right=rightTree;
            return root;
        }
    }

    二、重建二叉树

    博客对应课程的视频位置:2、重建二叉树
    https://www.fanrenyi.com/video/20/238

     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 假设输入的前序遍历和中序遍历的结果中都不含重复的数字。
    13 例如输入前序遍历序列[1,2,4,7,3,5,6,8]和中序遍历序列[4,7,2,1,5,3,8,6],
    14 则重建二叉树并返回。
    15 
    16 前序遍历序列:根左右:1,2,4,7,3,5,6,8
    17 中序遍历序列:左根右:4,7,2,1,5,3,8,6
    18 
    19 思路:
    20 1、找到根节点(前序序列的第一个元素一定是根节点)
    21 2、根据找到的根节点和中序序列,找到树的左子树和右子树
    22 3、让左子树和右子树进行1、2步的递归操作,来构建左子树和右子树
    23 
    24 根节点 为1
    25 左子树
    26 左子树的前序序列:根左右:2,4,7
    27 左子树的中序序列:左根右:4,7,2
    28 
    29 节点2的左子树
    30 左子树的前序序列:根左右:4,7
    31 左子树的中序序列:左根右:4,7
    32 
    33 
    34 右子树
    35 右子树的前序序列:根左右:3,5,6,8
    36 右子树的中序序列:左根右:5,3,8,6
    37 
    38 节点3的右子树
    39 右子树的前序序列:根左右:6,8
    40 右子树的中序序列:左根右:8,6
    41 
    42 算法思路:
    43 递归
    44 
    45 -->
    46 <script>
    47     let qianXu=[1,2,4,7,3,5,6,8];
    48     let zhongXu=[4,7,2,1,5,3,8,6];
    49 
    50     //在js中创建树的节点可以用构造函数
    51     function TreeNode(val){
    52         this.val=val;
    53         this.left=null;
    54         this.right=null;
    55     }
    56 
    57     function rebuildTree(qianXu,zhongXu){
    58         if(qianXu[0]){
    59             //1、找到根节点(前序序列的第一个元素一定是根节点)
    60             let rootVal=qianXu[0];//根节点的值
    61 
    62             //2、根据找到的根节点和中序序列,找到树的左子树和右子树
    63             //根节点在中序序列中的位置
    64             let index=zhongXu.indexOf(rootVal);
    65 
    66             //前序序列:左子树qianXu(1,index),右子树qianXu(index+1,最后)
    67             //中序序列:左子树zhongXu(0,index-1),右子树zhongXu(index+1,最后)
    68 
    69 
    70             //3、让左子树和右子树进行1、2步的递归操作,来构建左子树和右子树
    71             let leftTree=rebuildTree(qianXu.slice(1,index+1),zhongXu.slice(0,index));
    72             let rightTree=rebuildTree(qianXu.slice(index+1),zhongXu.slice(index+1));
    73 
    74             let root=new TreeNode(rootVal);
    75             root.left=leftTree;
    76             root.right=rightTree;
    77             return root;
    78         }
    79 
    80 
    81     }
    82 
    83     //rebuildTree(qianXu,zhongXu);
    84     console.log(rebuildTree(qianXu,zhongXu));
    85 
    86 
    87 
    88 
    89 </script>
    90 </body>
    91 </html>

     
  • 相关阅读:
    终于回来了&&邮递员送信
    发射站
    黑匣子
    利维坦——(1)
    预告
    整除(水题)
    BZOJ054_移动玩具_KEY
    BZOJ4034_树上操作_KEY
    树链剖分学习&BZOJ1036
    BZOJ1208_宠物收养所_KEY
  • 原文地址:https://www.cnblogs.com/Renyi-Fan/p/12908525.html
Copyright © 2011-2022 走看看