二叉树重建的模板:
buildTree(1...) { // 前、中序遍历的数组和preleft、preright、vinleft、vinright的边界
if (...) {
return nullptr;
}
TreeNode *root = new TreeNode(2...); // 前序遍历的第一个元素为根结点,不过这里的第一个元素是根据preleft变化的
root->left = buildTree(3....); //前序数组和中序数组当前节点的左子树
root->right = buildTree(4.....); // 前序数组和中序数组当前节点的右子树
return root;
}
java程序:
/**
* Definition for binary tree
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
import java.util.Arrays;
public class Solution {
public TreeNode reConstructBinaryTree(int [] pre,int [] in) {
if (pre.length == 0 || in.length == 0) {
return null;
}
int in_length = in.length;
int pre_length = pre.length;
TreeNode root = new TreeNode(pre[0]);
for (int i = 0; i < in_length; i++) {
if (in[i] == pre[0]) {
root.left = reConstructBinaryTree(Arrays.copyOfRange(pre, 1, i+1), Arrays.copyOfRange(in, 0, i));
root.right = reConstructBinaryTree(Arrays.copyOfRange(pre, i+1, pre_length), Arrays.copyOfRange(in, i+1, in_length));
break;
}
}
return root;
}
}