题目:
根据一棵树的前序遍历与中序遍历构造二叉树。
注意:
你可以假设树中没有重复的元素。
例如,给出:
前序遍历 preorder = [3,9,20,15,7]
中序遍历 inorder = [9,3,15,20,7]
返回如下的二叉树:
思路:
先序遍历的顺序是 Root -> Left -> Right,这就能方便的从根开始构造一棵树。
首先,preorder 中的第一个元素一定是树的根,这个根又将 inorder 序列分成了左右两棵子树。现在我们只需要将先序遍历的数组中删除根元素,然后重复上面的过程处理左右两棵子树。
代码:
贴上笔者的代码:
class Solution {
public TreeNode buildTree(int[] preorder, int[] inorder) {
if (preorder == null || inorder == null
|| preorder.length == 0
|| inorder.length == 0) {
return null;
}
List<Integer> preList = new ArrayList<>();
for (int i = 0; i < preorder.length; i++) {
preList.add(preorder[i]);
}
return helper(preList, inorder);
}
private TreeNode helper(List<Integer> preList, int[] inorder) {
if (preList.size() == 0 || inorder == null || inorder.length == 0) return null;
int value = preList.get(0);
preList.remove(0);
TreeNode node = new TreeNode(value);
int[] leftTree = null;
int[] rightTree = null;
for (int i = 0; i < inorder.length; i++) {
if (inorder[i] == value) {
leftTree = i==0?null:Arrays.copyOfRange(inorder, 0, i);
rightTree = i==inorder.length-1?null:Arrays.copyOfRange(inorder, i+1, inorder.length);
}
}
node.left = helper(preList, leftTree);
node.right = helper(preList, rightTree);
return node;
}
}
提交后获得通过:
不过看起来击败的用户数量不多,还有很大的优化空间。