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);
}
}