1. 程式人生 > 其它 >面試題 04.02. 最小高度樹(DFS)

面試題 04.02. 最小高度樹(DFS)

面試題 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, int
left, 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 };