C++实现LeetCode(108.将有序数组转为二叉搜索树)

C++实现LeetCode(108.将有序数组转为二叉搜索树)攻略

题目描述

给定一个有序整数数组,转换为高度平衡的二叉搜索树。

示例 1:

输入: [-10,-3,0,5,9]
输出: 
     0
    / \
  -3   9
  /   /
-10  5

示例 2:

输入: [1,3]
输出: 
  3
 / 
1  

题目分析

这道题目需要将有序整数数组转换为二叉搜索树,要求转换后的二叉树是平衡的,即左右子树的高度差不超过1。我们不难想到,可以采用递归的方式,将有序整数数组从中间位置划分成左右两个子数组,然后将中间的元素作为根节点,左子数组递归构建为根节点的左子树,右子数组递归构建为根节点的右子树。

解题思路

为了构建高度平衡的二叉搜索树,我们需要在递归过程中保证左右子树的高度差不超过1。具体的实现过程如下:

1.首先定义递归函数treeNode* buildBST(vector<int> &nums, int left, int right),其中nums为有序整数数组,leftright分别为当前递归的区间左右端点。

2.递归终止条件为left > right时,返回NULL表示空节点。

3.找到当前区间的中间位置mid = (left + right) / 2,将中间元素作为根节点创建treeNode* root = new treeNode(nums[mid])

4.递归构建根节点的左子树root->left = buildBST(nums, left, mid - 1);和右子树root->right = buildBST(nums, mid + 1, right);

5.返回根节点return root;

代码实现

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    TreeNode* sortedArrayToBST(vector<int>& nums) {
        return buildBST(nums, 0, nums.size() - 1);
    }

    TreeNode* buildBST(vector<int> &nums, int left, int right){
        if(left > right){
            return NULL;
        }
        int mid = (left + right) / 2;
        TreeNode* root = new TreeNode(nums[mid]);
        root->left = buildBST(nums, left, mid - 1);
        root->right = buildBST(nums, mid + 1, right);
        return root;
    }
};

示例说明

以示例1为例,输入数组[-10,-3,0,5,9],函数调用如下:

sortedArrayToBST([-10,-3,0,5,9])

即:

buildBST([-10,-3,0,5,9], 0, 4)
-> TreeNode(-3)
   /         \
NULL         TreeNode(9)
             /       \
     TreeNode(-10)  TreeNode(5)
            /          \
         NULL         NULL

所以输出结果是:

     0
    / \
  -3   9
  /   /
-10  5

以示例2为例,输入数组[1,3],函数调用如下:

sortedArrayToBST([1, 3])

即:

buildBST([1, 3], 0, 1)
-> TreeNode(3)
   /         \
TreeNode(1)  NULL
            /      
          NULL     

所以输出结果是:

  3
 / 
1  
阅读剩余 62%

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++实现LeetCode(108.将有序数组转为二叉搜索树) - Python技术站

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • ubuntu下安装迅雷

    Ubuntu下安装迅雷 在Ubuntu下安装迅雷需要进行以下步骤: 下载迅雷Linux版安装包 首先,我们需要从迅雷官网下载Linux版安装包。可以使用以下命令下载: bash wget http://down.sandai.net/thunder9/Thunder9.1.64.397.Linux.tar.gz 解压安装包 下载完成后,我们需要解压安装包。可…

    other 2023年5月8日
    00
  • SpringBoot项目速度提升之延迟初始化(Lazy Initialization)详解

    SpringBoot项目速度提升之延迟初始化(Lazy Initialization)详解 什么是延迟初始化? 在 SpringBoot 项目中,如果需要频繁地实例化大量的 Bean,就会导致系统启动速度变慢,影响用户体验。此时,可以使用延迟初始化的方式,在需要使用 Bean 时再去实例化,从而提高系统的启动速度。 如何使用延迟初始化? 延迟初始化可以通过在…

    other 2023年6月20日
    00
  • outlook提示错误:您的服务器不支持此客户端支持的任何验证方式

    这个错误通常出现在使用 Microsoft Outlook 邮件客户端的时候,提示指出该客户端不支持一些验证方式,而服务器又没有提供另外的验证方式,导致登录失败。 以下是跟解决此问题相关的几种步骤和方法: 1. 检查账户设置 首先,检查一下 Outlook 账户设置,确保使用的是正确的用户名和密码。另外还需要检查 Outlook 邮箱账户设置中的服务器地址是…

    other 2023年6月27日
    00
  • Android UI 中的 ListView列表控件的示例

    下面我将为您详细讲解“Android UI 中的 ListView 列表控件的示例”的完整攻略。 1. ListView 列表控件简介 ListView 是 Android 开发中最常用的列表控件之一,它可以用来展示大量的数据列表。ListView 的每一项都是一个 View 对象,可以包含多种不同的控件,如文本、按钮、图像等,用于显示相关数据。ListVi…

    other 2023年6月27日
    00
  • word2003自定义文件属性的方法

    当我们使用Microsoft Word 2003创建文档时,有时需要向文档添加一些自定义信息,如作者、标题、主题等,这些信息被称为文件属性。在本篇文章中,我们将介绍如何使用Word 2003的自定义文件属性功能。 步骤一:打开Word文档 首先,我们需要打开一个Word文档。打开文档后,单击工具栏中的“文件”选项,然后单击下拉菜单中的“属性”选项。 步骤二:…

    other 2023年6月25日
    00
  • ssh实现内网穿透 你需要的都在这里

    以下是关于“SSH实现内网穿透你需要的都在这里”的完整攻略,包含两个示例。 SSH实现内网穿透你需要的都在这里 SSH是一种安全的远程登录协议,可以通过SSH实现内网穿透。以下是关于如何使用SSH实现内网穿透的详细攻略。 1. 使用SSH端口转发实现内网穿透 SSH端口转发是一种常用的内网穿透方式。以下是一个使用SSH端口转发实现内网穿透的示例: 在公网服务…

    other 2023年5月9日
    00
  • 10个很棒的 CSS3 开发工具 推荐

    10个很棒的 CSS3 开发工具 推荐攻略 本攻略将介绍10个很棒的 CSS3 开发工具,这些工具可以帮助开发人员更高效地使用 CSS3 技术。以下是这些工具的详细介绍: 1. CSS3 Generator CSS3 Generator 是一个在线工具,可以帮助开发人员生成各种 CSS3 效果的代码。它提供了一个直观的界面,让用户可以通过简单的操作生成阴影、…

    other 2023年7月27日
    00
  • C语言简明介绍常见关键字的用法

    C语言简明介绍常见关键字的用法 C语言作为一种广泛应用于系统编程和嵌入式开发的程序设计语言,在程序员中拥有广泛的用户群体。C语言中关键字的使用对于程序开发来说是至关重要的。在这里,我们将简明介绍一些C语言中常见关键字的用法。 数据类型关键字 C语言中有丰富的数据类型,每种类型都有其对应的关键字。在程序中正确使用这些关键字是确保数据类型正确运用的关键。 int…

    other 2023年6月27日
    00
合作推广
合作推广
分享本页
返回顶部