zoukankan      html  css  js  c++  java
  • 从前序与中序遍历序列构造二叉树 递归

    题目:

      

     思路:

      根据前序遍历的第一个数我们可以知道 根节点

      根据 根节点 去中序遍历中可以分出左树 与 右树

      运用极限逼近的思想,假设只有三个数据   

      前序【3,9,20】

      中序【9,3,20】

      去设计算法:   我们将中序中的数据存入map 中 value 存值得下标,根据蓝色字的思想,递归去构建树


    (一)代码  递归

       

    class Solution {
        public TreeNode buildTree(int[] preorder, int[] inorder) {
    
            //map 中key 存中序遍历的元素, value 存元素下标
            Map<Integer, Integer> map = new HashMap<Integer, Integer>();
            for(int i= 0 ; i < inorder.length ; i++){
                map.put(inorder[i],i);
            }
    
            return buildTreeNode(preorder,0,preorder.length,inorder,0,inorder.length,map);
    
        }
    
        public TreeNode buildTreeNode(int[] preorder,int pre_start,int pre_end,int[] inorder,int in_start,int in_end,Map<Integer, Integer> map){
    
            //当pre_Start == pre_End 递归出口
            if(pre_start == pre_end){
                return null;
            }
    
            //构建树
            TreeNode tree = new TreeNode(preorder[pre_start]);
    
            //获取中序遍历中root的位置
            int midkey = map.get(preorder[pre_start]);
    
            //根据中序遍历找到左边的数量 ,  通过这个去算先序遍历的结束位置
            int leftnum = midkey - in_start;
    
            tree.left = buildTreeNode(preorder,pre_start+1,pre_start+1+leftnum,inorder,in_start,midkey-1,map);
            tree.right = buildTreeNode(preorder,pre_start+1+leftnum,pre_end,inorder,midkey+1,in_end,map);
    
            return tree;
        }
    }

          利好白酒

      

  • 相关阅读:
    CSS常用原子类base.css
    前端开发规范集锦
    C#(.NET) HMAC SHA256实现
    windows200364位iis6 php环境搭建
    MSSQL数据库分页存储过程
    C#动态调用webservice
    SQL语句之备份表
    双网卡内外网同时使用的方法
    SQL2008 提示评估期已过的解决方法
    时间服务器设置局域网时间同步
  • 原文地址:https://www.cnblogs.com/misscai/p/14943975.html
Copyright © 2011-2022 走看看