码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2021-06-28 20:54:30      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:二叉树   ==   获取   width   元素   int   str   style   下标   

题目:

  技术图片

 

 思路:

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

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

 

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

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

 

 

 

      利好白酒

  

 

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

标签:二叉树   ==   获取   width   元素   int   str   style   下标   

原文地址:https://www.cnblogs.com/misscai/p/14943975.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!