合肥网站建设团队豌豆荚app下载 官网
本文参考代码随想录
将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树。
思路:寻找分割点,分割点作为当前节点,然后递归左区间和右区间。
递归法
取中间值为root,递归左区间成为root的左孩子,右区间成为root的右孩子,最后返回root
class Solution {
private:TreeNode* traversal(vector<int>& nums,int left, int right){//若数组为空则返回if(left > right) return nullptr;int mid = left + (right - left) / 2;//防止遇到INT_MAX长度溢出TreeNode* root = new TreeNode(nums[mid]);root->left = traversal(nums, left, mid - 1);root->right = traversal(nums, mid + 1, right);return root;}
public:TreeNode* sortedArrayToBST(vector<int>& nums) {TreeNode* root = traversal(nums, 0, nums.size() - 1);return root;}
};
迭代法
通过三个队列来模拟,一个队列放遍历的节点,一个队列放左区间下标,一个队列放右区间下标
class Solution {
public:TreeNode* sortedArrayToBST(vector<int>& nums) {if(nums.size() == 0) return nullptr;TreeNode* root = new TreeNode(0);queue<TreeNode*> nodeQue;//存放遍历的节点queue<int> leftQue;//存放左区间下标queue<int> rightQue;//存放右区间下标nodeQue.push(root);leftQue.push(0);rightQue.push(nums.size() - 1);while(!nodeQue.empty()){TreeNode* curNode = nodeQue.front();nodeQue.pop();int left = leftQue.front();leftQue.pop();int right = rightQue.front();rightQue.pop();int mid = left + (right - left) / 2;curNode->val = nums[mid];//为根节点赋值if(left <= mid - 1){//左区间存在,则处理左区间curNode->left = new TreeNode(0);nodeQue.push(curNode->left);leftQue.push(left);rightQue.push(mid - 1);}if(right >= mid + 1){//右区间存在,则处理右区间curNode->right = new TreeNode(0);nodeQue.push(curNode->right);leftQue.push(mid + 1);rightQue.push(right);}}return root;}
};