題目:
根據一棵樹的前序遍歷與中序遍歷構造二叉樹。
注意:
你可以假設樹中沒有重複的元素。
例如,給出:
前序遍歷 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;
}
}
提交後獲得通過:
不過看起來擊敗的用戶數量不多,還有很大的優化空間。