Given preorder and inorder traversal of a tree, construct the binary tree.
Example:
preorder = [3,9,20,15,7]
inorder = [9,3,15,20,7]
output [3,9,20,null,null,15,7]
解釋下題目:
給定先序遍歷和中序遍歷的數(shù)組,構(gòu)造出對(duì)應(yīng)一棵樹(shù)。
1. 迭代
實(shí)際耗時(shí):8ms
public TreeNode buildTree(int[] preorder, int[] inorder) {
return recursive(preorder, 0, preorder.length, inorder, 0, inorder.length);
}
public TreeNode recursive(int[] preorder, int preStart, int preEnd, int[] inorder, int inStart, int inEnd) {
if (preStart >= preorder.length || inStart >= inorder.length || preStart > preEnd || inStart > inEnd) {
return null;
}
TreeNode root = new TreeNode(preorder[preStart]);
//找到分割點(diǎn)的下標(biāo)
int index = -1;
for (int i = inStart; i <= inEnd; i++) {
if (inorder[i] == preorder[preStart]) {
index = i;
break;
}
}
root.left = recursive(preorder, preStart + 1, preorder.length, inorder, inStart, index - 1);
root.right = recursive(preorder, preStart + index - inStart + 1, preorder.length, inorder, index + 1, inEnd);
return root;
}
??思路:因?yàn)槭菢?shù)的問(wèn)題,所以肯定是遞歸。然后在先序數(shù)組和中序數(shù)組中找一個(gè)相同的元素(題目中說(shuō)了所有的節(jié)點(diǎn)的值都互不相同),這個(gè)元素必定是當(dāng)前所在的這一層的根元素,然后inorder的左邊就是左子樹(shù),而右邊是右子樹(shù),遞歸即可。