剑指offer 07重建二叉树(根据前序、中序遍历)草真tm难

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    //这题是我遇到解答最难的一道题,我一度刷题想要放弃,今天下定决心搞出来
    //整个算法思想:前序遍历[根节点|左子树|右子树];中序遍历[左子树|根节点|右子树];
    //定义root为前序遍历中根节点位置,定义left为中序遍历中子树左边界,定义right为中序遍历中子树右边界
    //首先根据前序遍历中根节点位置找到中序遍历中根节点位置可以把中序遍历划分开来,
    //再根据左右子树元素数量,划分前序遍历。最后得出,左右子树分别的前序根节点,中序左右边界。
    //在回溯时,新建头节点,还原二叉树。
    //定一个数组,目的是为了resur递归这个函数可以使用到这个数组
    int preorder[];
    //建立实例引用变量是为了方法间共享
    Map<Integer,Integer> maplist = new HashMap<Integer,Integer>();
    public TreeNode buildTree(int[] preorder, int[] inorder) {
        this.preorder = preorder;//通过this变量把传进来的引用拷贝一下
        for(int i = 0; i < inorder.length; i++){
            maplist.put(inorder[i] , i);
            //做一个值到索引的映射,可以通过值直接找到中序遍历中的索引位置
        }
        return resur(0, 0, preorder.length - 1);
    }
    public TreeNode resur(int root, int left, int right){
        if(left > right) { return null;}//终止条件
        TreeNode node = new TreeNode(preorder[root]);//回溯的时候建立二叉树
        int i = maplist.get(preorder[root]);
        //通过前序遍历中的值,直接找到中序遍历中的索引
        node.left = resur(root + 1, left, i - 1);//递归左子树
        node.right = resur(root - left + i + 1, i + 1, right);//递归右子树
        return node;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值