📜  门| GATE CS Mock 2018 |设置 2 |第 54 题(1)

📅  最后修改于: 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

思路

  • 平衡二叉树的定义是左右子树高度差的绝对值不超过1。
  • 因为给定的数组是升序的,所以我们可以把数组的中间元素作为根节点,然后递归构建左右子树。
  • 递归过程中,左子树由数组的左半部分构成,右子树由数组的右半部分构成。
  • 实现时需要注意两个要点:1. 左右子树递归的时候,需要分别传入数组的左右半部分;2. 数组下标需要减1,才能用于构建子树。

代码实现

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才能用于构建子树。