LeetCode105-前序+中序构造树

题目描述

根据一棵树的前序遍历与中序遍历构造二叉树。
注意:
你可以假设树中没有重复的元素。

我的题解:递归

前序拿到根节点,在中序中找到该节点左边的元素和右边的元素,递归下去.

public class Offer_07 {
    private int [] preorder;
    private Map<Integer,Integer> map;//用于记录中序中节点对应的索引。
    private int preIndex=0; //前序数组中从头开始遍历

    public TreeNode buildTree(int[] preorder, int[] inorder) {
        this.preorder = preorder;
        map = new HashMap<>();
        for (int i=0;i<inorder.length;i++)map.put(inorder[i],i);
        return cur(0,preorder.length);
    }

    private TreeNode cur(int inorderBegin,int inorderEnd){
        if (preIndex>=preorder.length)return null;
        int rootVal = preorder[preIndex];
        System.out.println("preorder[ "+preIndex+" ]:"+rootVal+",子元素:[ " +inorderBegin+" , "+inorderEnd+" ]");
        TreeNode root = new TreeNode(rootVal);
        if (inorderBegin+1>=inorderEnd)return root;
        int index = map.get(rootVal);
        if (index==inorderBegin){
            preIndex++;
            root.right = cur(inorderBegin+1,inorderEnd);
        }
        else if (index==inorderEnd-1){
            preIndex++;
            root.left = cur(inorderBegin,inorderEnd-1);
        }
        else{
            preIndex++;
            root.left = cur(inorderBegin, index);
            preIndex++;
            root.right = cur(index+1,inorderEnd);
        }
        return root;
    }
}

猜你喜欢

转载自www.cnblogs.com/XT-xutao/p/12940767.html