• 从前序与中序遍历序列构造二叉树 递归


    题目:

      

     思路:

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

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

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

      前序【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;
        }
    }

          利好白酒

      

  • 相关阅读:
    Docker 安装NGINX
    Ant 使用setFieldsValue更新Form表单值
    SpringSecurity设置角色和权限
    java 获取昨天、今天、明天的时间
    Ubuntu 20.04 root ssh登录配置
    http: server gave HTTP response to HTTPS client解决方案:
    06-多线程笔记-2-锁-3-Lock
    05-多线程笔记-2-锁-2-Synchronized
    04-多线程笔记-2-锁-1-死锁
    volatile
  • 原文地址:https://www.cnblogs.com/misscai/p/14943975.html
Copyright © 2020-2023  润新知