105. 从前序与中序遍历序列构造二叉树

/**

 * Definition for a binary tree node.

 * public class TreeNode {

 *     int val;

 *     TreeNode left;

 *     TreeNode right;

 *     TreeNode(int x) { val = x; }

 * }

 */

class Solution {

    public TreeNode buildTree(int[] preorder, int[] inorder) {

        return buildTreeHelper(preorder,0,preorder.length,inorder,0,inorder.length);

    }

        //左闭右开

    public TreeNode buildTreeHelper(int[] preorder, int p_start,int p_end,int[] inorder,int i_start,int i_end){

        //判空

        if (p_start == p_end) {

        return null;

        }

        //获取前序的根节点值

        int root_val=preorder[p_start];

        TreeNode root=new TreeNode(root_val);

        //每次中序根节点位置

        int i_root_idx=0;

        for(int i=i_start;i<i_end;i++){

            if(root_val==inorder[i]){

                   i_root_idx=i;

                   break; 

            }

        }

        int i_plus=i_root_idx-i_start;  //每次根节点和左面距离,eg 0,2

        //递归的构造左子树,前序从第二个开始,第一个写好了第二个直接写

        //注意边界,左闭右开,跳过根节点

        root.left=buildTreeHelper(preorder,p_start+1,p_start+i_plus+1,

        inorder,i_start,i_root_idx);

        //递归的构造右子树

        root.right=buildTreeHelper(preorder,p_start+i_plus+1,p_end,

        inorder,i_root_idx+1,i_end);

 

        return root;

    }

}。

还需优化map

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值