思路:
- 首先可以根据前序遍历和后序遍历的特点找到根节点
- 通过中序遍历找到左子树的长度,即可推导出右子树的长度
- 分别构建左右子树
前序遍历与中序遍历构造二叉树
public class Solution {
public TreeNode buildTree(int[] preorder, int[] inorder) {
if (preorder.length == 0) {
return null;
}
int rootValue = preorder[0];
TreeNode root = new TreeNode(rootValue);
int leftSize = 0;
for (int i = 0; i < inorder.length; i++) {
if (inorder[i] == rootValue) {
leftSize = i;
}
}
int[] leftPreorder = Arrays.copyOfRange(preorder, 1, 1 + leftSize);
int[] leftInorder = Arrays.copyOfRange(inorder, 0, leftSize);
root.left = buildTree(leftPreorder, leftInorder);
int[] rightPreorder = Arrays.copyOfRange(preorder, 1 + leftSize, preorder.length);
int[] rightInorder = Arrays.copyOfRange(inorder, leftSize + 1, inorder.length);
root.right = buildTree(rightPreorder, rightInorder);
return root;
}
}
中序遍历与后序遍历构造二叉树
class Solution {
public TreeNode buildTree(int[] inorder, int[] postorder) {
if(postorder.length==0){
return null;
}
int rootValue = postorder[postorder.length-1];
TreeNode node = new TreeNode(rootValue);
int leftSize = 0;
for(int i=0;i<inorder.length;i++){
if(inorder[i]==rootValue){
leftSize = i ;
}
}
int [] leftInorder = Arrays.copyOfRange(inorder,0,leftSize);
int [] leftPostorder = Arrays.copyOfRange(postorder,0,leftSize);
node.left = buildTree(leftInorder,leftPostorder);
int [] rightInorder = Arrays.copyOfRange(inorder,leftSize+1,inorder.length);
int [] rightPostorder = Arrays.copyOfRange(postorder,leftSize,postorder.length-1);
node.right = buildTree(rightInorder,rightPostorder);
return node;
}
}