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

https://leetcode.cn/problems/construct-binary-tree-from-inorder-and-postorder-traversal/

思路和106. 从中序与后序遍历序列构造二叉树相同

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {

    public TreeNode buildTree(int[] preorder, int[] inorder) {
        if(preorder.length==0 || inorder.length==0)return null;
        return build(preorder,inorder,0,preorder.length,0,inorder.length);
    }
    // 左闭右开
    public TreeNode build(int[] preorder,int[] inorder,int preStart,int preEnd,int inStart,int inEnd)
    {
        if(preStart==preEnd)return null;
        TreeNode root = new TreeNode(preorder[preStart]);
        
        int mid;
        for(mid=inStart;mid<inEnd;mid++)
            if(inorder[mid]==preorder[preStart])break;

        int leftInStart = inStart;
        int leftInEnd = mid;
        int rightInStart = mid+1;
        int rightInEnd = inEnd;

        
        int leftPreStart = preStart+1;
        // leftInEnd-leftInStart 是中序左子树长度
        System.out.println(leftInEnd-leftInStart);
        int leftPreEnd = leftPreStart + leftInEnd - leftInStart;
        int rightPreStart = leftPreEnd;
        int rightPreEnd = preEnd;

        root.left = build(preorder,inorder,leftPreStart,leftPreEnd,leftInStart,leftInEnd);
        root.right = build(preorder,inorder,rightPreStart,rightPreEnd,rightInStart,rightInEnd);

        return root;

    }
}

 

posted @   风乐  阅读(6)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
点击右上角即可分享
微信分享提示