剑指 Offer 07. 重建二叉树
题目描述
输入某二叉树的前序遍历和中序遍历的结果,请构建该二叉树并返回其根节点。
假设输入的前序遍历和中序遍历的结果中都不含重复的数字。
解答
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public TreeNode buildTree(int[] preorder, int[] inorder) {
if(preorder.length < 1){
return null;
}
TreeNode root = new TreeNode(preorder[0]); //创建根节点
//将前序和中序序列划分
List<Integer> leinorder = new ArrayList<>();
List<Integer> riinorder = new ArrayList<>();
boolean isappear = false;
for(int i = 0;i < inorder.length;i++){
if(inorder[i] == preorder[0]){
isappear = true;
}else if(isappear == false){
leinorder.add(inorder[i]);
}else if(isappear == true){
riinorder.add(inorder[i]);
}
}
List<Integer> lepreorder = new ArrayList<>();
List<Integer> ripreorder = new ArrayList<>();
if(leinorder.size() > 0||riinorder.size()>0){
int i;
for(i = 1;i < leinorder.size()+1;i++){
lepreorder.add(preorder[i]);
}
for(int j = i;j < riinorder.size()+i;j++){
ripreorder.add(preorder[j]);
}
}
// int[] mid = lepreorder.stream().mapToInt(Integer::valueOf).toArray();
root.left = buildTree(lepreorder.stream().mapToInt(Integer::valueOf).toArray(),leinorder.stream().mapToInt(Integer::valueOf).toArray());
root.right = buildTree(ripreorder.stream().mapToInt(Integer::valueOf).toArray(),riinorder.stream().mapToInt(Integer::valueOf).toArray());
return root;
}
}