题目描述
给你一个整数数组 nums ,其中元素已经按升序排列,请你将其转换为一棵高度平衡二叉搜索树。
高度平衡二叉树是一棵满足「每个节点的左右两个子树的高度差的绝对值不超过 1 」的二叉树。
问题分析
递归法: 有序数组,只要将中间位置设为头节点,然后递归处理左区间和右区间,就可以构造平衡二叉树
迭代法: 通过三个队列来模拟迭代法,第一队列保存遍历的节点,第二个队列保存左区间下标,第三个队列保存右区间下标
代码实现
// 编程软件:VS2019
// 参考书籍:代码随想录
#include<iostream>
#include<vector>
#include<queue>
using namespace std;
// 定义二叉树
struct TreeNode {
int val;
TreeNode* left;
TreeNode* right;
TreeNode(int v):val(v),left(nullptr),right(nullptr){}
};
// 递归法:有序数组,只要将中间位置设为头节点,然后递归处理左区间和右区间,就可以构造平衡二叉树
TreeNode* traversal(vector<int>& nums, int left, int right) {
// 左边界大于右边界,表明已处理区间的所有节点,返回NULL
if (left > right) return NULL;
// 如果数组长度为偶数,中间位置有二个元素,则取靠左边的元素
int mid = left + ((right - left) / 2);
TreeNode* root = new TreeNode(nums[mid]); //建立新节点
root->left = traversal(nums, left, mid - 1); // 递归左区间
root->right = traversal(nums, mid + 1, right); // 递归有区间
return root; // 返回新节点
}
TreeNode* sortedArrayToBST1(vector<int>& nums) {
TreeNode* root = traversal(nums, 0, nums.size() - 1);
return root;
}
// 迭代法:通过三个队列来模拟迭代法,第一队列保存遍历的节点,第二个队列保存左区间下标,第三个队列保存右区间下标
TreeNode* sortedArrayToBST2(vector<int>& nums) {
if (nums.size() == 0) return NULL; // 数组为空,二叉树为空
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); // num.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;
}
int main() {
vector<int> nums = { -10,-3,0,5,9 };
TreeNode* root = sortedArrayToBST2(nums);
cout << root->val;
}
// 结果:0