📅  最后修改于: 2023-12-03 15:42:13.293000             🧑  作者: Mango
本题给出一个长度为N的升序数组A,你需要将A[]转化成一个平衡二叉树,并返回该二叉树的根节点。
以下是函数的定义:
TreeNode* sortedArrayToBST(const vector<int> &A) {
// 函数实现
}
A: 长度为N的升序整数数组。
输出: 返回平衡二叉树的根节点。
注: 函数中由以下结构体定义二叉树节点:
struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
例1:
Input: A[] = {1, 2, 3, 4, 5, 6, 7};
Output: 4
/ \
2 6
/ \ / \
1 3 5 7
例2:
Input: A[] = {1, 2, 3};
Output: 2
/ \
1 3
TreeNode* sortedArrayToBST(const vector<int> &A) {
if (A.empty()) { // 如果数组为空,则返回NULL
return NULL;
}
int mid = A.size() / 2; // 取中间元素作为根节点
TreeNode* root = new TreeNode(A[mid]); // 新建二叉树节点
vector<int> left(A.begin(), A.begin() + mid); // 左边子树由数组的左半部分构成
vector<int> right(A.begin() + mid + 1, A.end()); // 右边子树由数组的右半部分构成
root->left = sortedArrayToBST(left); // 构建左子树
root->right = sortedArrayToBST(right); // 构建右子树
return root; // 返回根节点
}
时间复杂度:$O(NlogN)$
空间复杂度:$O(logN)$
本题考查了对平衡二叉树的定义和构建方法的理解。需要注意的是,左右子树构建时需要传入数组的左右半部分,数组下标需要减1才能用于构建子树。