使用前序中序构建二叉树

1. 思路

本题使用递归实现,思路为
f(前,中,prel,prer,midl,midr)
区间形式为[prel,prer)
1.根据前序遍历寻找根节点
2. 在中序遍历中找到根节点的下标 mid
3. 求解 prell(左子树前序序列的左边界) prelr midll midlr prerl prerr midrl midrr
4. node(mid).left=f(前,中, prell prelr midll midlr) node(mid).right=f(前,中, prerl prerr midrl midrr)

2. 易错点

递归终止条件为 左==右,return null,如果写成右-左==1(数组有一个元素),返回 对应的节点,如果递归时该子树只有一个节点,此时可以使用该递归条件,因为在此处终止,就不会出现左==右的情况,如果一开始就是左==右,即[],则会数组越界,0越界空数组

3. 代码

    public TreeNode jbuildTree(int[] preorder, int[] inorder) {
        return buildTreeByDG(preorder,inorder,0,preorder.length,0,inorder.length);
    }
      public TreeNode buildTreeByDG(int[] preorder, int[] inorder,int prel,int prer,int midl,int midr) {
        if(prer-prel==0){
            return null;
        }
        int midvalue=preorder[prel];
        int midIndex = searchIndex(midvalue, inorder, midl, midr);
        int midll=midl,
                midlr=midIndex,
                midrl=midIndex+1,
                midrr=midr,
                prell=prel+1,
                prelr=prell+(midlr-midll),
                prerl=prelr,
                prerr=prer;
        TreeNode root = new TreeNode(midvalue);
        root.left=buildTreeByDG(preorder,inorder,prell,prelr,midll,midlr);
        root.right=buildTreeByDG(preorder,inorder,prerl,prerr,midrl,midrr);
        return root;
    }
    public int searchIndex(int targetValue,int[] inorder, int midl,int midr ){
        for (int i = midl; i <midr ; i++) {
            if (inorder[i]==targetValue){
                return i;
            }
        }
        return -1;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

弈师亦友

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值