本文记录的是刷题过程中的重要概念和笔记。如有侵权,请联系删除。
108.将有序数组转换为二叉搜索树
力扣题目链接(opens new window)
将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树。
本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。
示例:
递归
class Solution
{
public:
TreeNode *bulidBST(vector<int> &nums, int begin, int end)
{
// [ )
if (begin == end)
return nullptr;
// 可省略,下面已经包含
if (begin + 1 == end)
return new TreeNode(nums[begin]);
// single
int mid = begin + (end - begin) / 2;
TreeNode *node = new TreeNode(nums[mid]);
node->left = bulidBST(nums, begin, mid);
node->right = bulidBST(nums, mid + 1, end);
return node;
}
TreeNode *sortedArrayToBST(vector<int> &nums)
{
return bulidBST(nums, 0, nums.size());
}
};
- int mid = begin + (end - begin) / 2; 防越界
迭代法 *
迭代的方法,其实就是模拟取中间元素,然后不断分割去构造二叉树的过程。存放节点,区间开始结束索引号。
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); // 0为左区间下标初始位置
rightQue.push(nums.size() - 1); // 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]; // 将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;
}
};