[LeetCode]將有序陣列轉換為二叉搜尋樹
阿新 • • 發佈:2019-02-18
將一個按照升序排列的有序陣列,轉換為一棵高度平衡二叉搜尋樹。
本題中,一個高度平衡二叉樹是指一個二叉樹每個節點 的左右兩個子樹的高度差的絕對值不超過 1。
示例:
給定有序陣列: [-10,-3,0,5,9], 一個可能的答案是:[0,-3,9,-10,null,5],它可以表示下面這個高度平衡二叉搜尋樹: 0 / \ -3 9 / / -10 5 ///////////////////////////////////////////////////////////////////////////////////////////
之前做到過二叉搜尋樹的題目,特點是右子樹比根節點大,左子樹比根節點小。這道題附加了一個條件,要求高度差不超過1。
給的條件是“升序排列”,那思路就有了,直接找陣列中間值作為根節點,因為是升序,中間值的位置就在陣列的中點。用中間值把陣列分割成兩部分,前半部分都是小於中間值的,後半部分都大於中間值。將新得到的兩個陣列繼續做相同的處理,前半部分返回值為左子樹,後半部分的返回值為右子樹。直到陣列長度為1,建立一個節點並賦值為這個長度為1的陣列的值,返回即可。
如果陣列長度為0,返回NULL。
class Solution { public: TreeNode *sortedArrayToBST(vector<int>& nums) { TreeNode *n; TreeNode *root = new TreeNode(0); TreeNode *left = new TreeNode(0); TreeNode *right = new TreeNode(0); vector<int> l; vector<int> r; if (nums.size() == 0) return NULL; if (nums.size()!=1) { l.clear(); r.clear(); int d; if(nums.size()%2==0) d = nums.size() / 2; else d = (nums.size() - 1) / 2; root->val = nums[d]; for (int i = 0; i < d; i++) l.push_back(nums[i]); for (int j = d+1; j < nums.size(); j++) r.push_back(nums[j]); left = sortedArrayToBST(l); right = sortedArrayToBST(r); root->left = left; root->right = right; } else root->val = nums[0]; return root; } };