面試題 04.02. 最小高度樹(DFS)
阿新 • • 發佈:2022-05-26
面試題 04.02. 最小高度樹
給定一個有序整數陣列,元素各不相同且按升序排列,編寫一個演算法,建立一棵高度最小的二叉搜尋樹。
示例:給定有序陣列: [-10,-3,0,5,9],
一個可能的答案是:[0,-3,9,-10,null,5],它可以表示下面這個高度平衡二叉搜尋樹:
0
/ \
-3 9
/ /
-10 5
下面是一種構造最小高度樹的思路:
1、如果序列長度為 0,那麼是一棵空樹。
2、如果序列長度為 1,那麼只有一個根節點。
3、如果長度大於 1,那麼選取中間位置的數賦給根節點,然後前一半遞迴構建左子樹,後一半遞迴構建右子樹。
1 /** 2 * Definition for a binary tree node. 3 * struct TreeNode { 4 * int val; 5 * TreeNode *left; 6 * TreeNode *right; 7 * TreeNode(int x) : val(x), left(NULL), right(NULL) {} 8 * }; 9 */ 10 class Solution { 11 public: 12 TreeNode *dfs(const vector<int> &nums, intleft, int right) { 13 if (left > right) { 14 return nullptr; 15 } 16 int mid = (left + right) >> 1; 17 TreeNode *root = new TreeNode(nums[mid]); // 建立當前節點 18 root->left = dfs(nums, left, mid - 1); // 左子樹填充值來自區間[left, mid - 1] 19 root->right = dfs(nums, mid + 1, right); // 右子樹填充值來自區間[md + 1, right] 20 return root; 21 } 22 TreeNode* sortedArrayToBST(vector<int>& nums) { 23 return dfs(nums, 0, nums.size() - 1); 24 } 25 };