LeetCode-ツリーの最初の順序と中の順序でツリーを再構築します.

1582 ワード

public class Solution {

    public TreeNode buildTree(int[] preorder, int[] inorder) { 
                // This is important! 
                if(preorder.length==0 || inorder.length==0) return null;  
		return buildTree0(preorder, 0, preorder.length-1, inorder, 0, inorder.length-1);
    }
    
    private TreeNode buildTree0(int[] preorder, int pref, int prel, int[] inorder, int inf, int inl) {  
    	
    	// New SubRoot
        int subr = preorder[pref];
        TreeNode subRoot = new TreeNode(subr);
        
        // Find LeftTree & RightTree
        int index = getinorderRootIndex(subr, inorder, inf, inl);
        int leftTreeSize = index - inf;
        int rightTreeSize = inl - index;
        if(leftTreeSize!=0)
        	subRoot.left = buildTree0(preorder, pref+1, pref+leftTreeSize, inorder, inf, inf+leftTreeSize-1);
        if(rightTreeSize!=0)
        	subRoot.right = buildTree0(preorder, pref+leftTreeSize+1, prel, inorder, inf+leftTreeSize+1, inl);
        
		return subRoot;
    }
    
    private int getinorderRootIndex(int subr, int[] inorder, int inf, int inl) {
    	for(int i=inf; i<=inl; i++) {
    		if(subr==inorder[i])
    			return i; 
    	}
    	return -1;
    }
    
    public void travel(TreeNode root) {
    	if(root==null) return;
    	System.out.println(root.val);
    	travel(root.left);
    	travel(root.right);
    }
    
    public static void main(String[] args) {
    	Solution s = new Solution();
		TreeNode root = s.buildTree(new int[]{1,2,4,5,3,6}, new int[]{4,2,5,1,6,3});
		s.travel(root);
	}
}