解法一 遞迴
思路
前序遍歷順序為 中 - 左 - 右,中序遍歷的順序為 左 - 中 - 右。這意味著前序遍歷的第一個元素必為根節點,我們需要在中序遍歷中找到這個節點的索引,隨後中序遍歷陣列中這個索引左邊的陣列是左子樹,右邊的所有元素是右子樹。
程式碼
/**
* 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 == null || preorder.length == 0 || inorder == null || inorder.length == 0) {
return null;
}
return helper(preorder, inorder, 0, 0, inorder.length - 1);
}
private TreeNode helper(int[] preorder, int[] inorder, int preSt, int inSt, int inEnd) {
if (inSt > inEnd || preSt > preorder.length) {
return null;
}
// Set the first value in preorder as root node
TreeNode head = new TreeNode(preorder[preSt]);
// Look for the root node index in inorder traversal
int i = inSt;
while (i <= inEnd) {
if (inorder[i] == preorder[preSt]) {
break;
}
i++;
}
// 設定左子樹和右子樹。
// 左子樹在 preorder 中從根節點後一個數開始(我們只需要這個索引,因為我們只需在 preorder 陣列中找到根節點的值)。在 inorder 中左子樹從 inSt 到 i - 1 結束。
// 右子樹在 preorder 中從左子樹結束後的位置開始,為了找到這個索引,我們要根據 inorder 陣列計算左子樹長度,為 (i - inSt)。在 inorder 中右子樹從 i + 1 到 inEnd 結束。
head.left = helper(preorder, inorder, preSt + 1, inSt, i - 1);
head.right = helper(preorder, inorder, preSt + (i - inSt) + 1, i + 1, inEnd);
return head;
}
}
複雜度分析
- 時間複雜度
- O(n)
- 空間複雜度
- O(n)
本作品採用《CC 協議》,轉載必須註明作者和本文連結