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

yizhihongxing

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  

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

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

相关文章

  • iOS12公测版Beta4描述文件下载地址及安装方法

    iOS 12 公测版 Beta 4 描述文件下载地址及安装方法攻略 iOS 12 公测版 Beta 4 是苹果公司提供给用户测试的最新版本。本攻略将详细介绍如何下载描述文件并安装 iOS 12 公测版 Beta 4。以下是完整的攻略步骤: 步骤一:下载描述文件 打开 Safari 浏览器,访问 Apple Beta Software Program 官方网站…

    other 2023年8月4日
    00
  • fedora20安装hadoop-2.5.1

    Fedora 20上安装Hadoop-2.5.1 Hadoop是一个开源的分布式系统框架,用于处理大规模数据的存储和计算。本文介绍了在Fedora 20系统上安装Hadoop-2.5.1的步骤以及可能遇到的问题和解决方法。 安装Java Hadoop是用Java编写的,因此需要先安装JDK。 打开终端,输入以下命令安装JDK: bash sudo dnf i…

    其他 2023年3月28日
    00
  • 关于尾递归的使用详解

    关于尾递归的使用详解 什么是尾递归 尾递归可以理解为一种特殊的递归,它是指递归函数在执行完成最后一步操作后,调用自身函数。也就是说,函数调用发生在函数的最后一条语句中,不再执行任何操作。 相比于普通递归,尾递归有两个主要优点: 尾递归更加高效,因为它只需保存一个栈帧,而不是保存每一层递归都需要的栈帧。 尾递归可以通过尾递归优化,将递归函数转化为迭代函数,从而…

    other 2023年6月27日
    00
  • macOS Big Sur 11.0.1修订版更新 固件内部版本号为20B50

    macOS Big Sur 11.0.1修订版更新攻略 概述 macOS Big Sur 11.0.1修订版是苹果公司发布的最新操作系统版本。该版本的固件内部版本号为20B50。本攻略将详细介绍如何进行该修订版的更新。 步骤 备份数据:在进行任何操作系统更新之前,建议您备份重要的数据。这样可以确保在更新过程中不会丢失任何文件或设置。 连接到互联网:确保您的设…

    other 2023年8月2日
    00
  • FreeBSD设置IP地址、网关、DNS的方法

    FreeBSD设置IP地址、网关、DNS的方法 在FreeBSD中,可以通过编辑网络配置文件来设置IP地址、网关和DNS。以下是详细的步骤: 打开终端并以root用户身份登录。 使用文本编辑器(如vi或nano)打开网络配置文件/etc/rc.conf。 shell # vi /etc/rc.conf 在文件中找到以下行(如果不存在,则添加): shell …

    other 2023年7月30日
    00
  • JavaScript 数组常见操作技巧 (二)

    当然,下面就是详细讲解“JavaScript 数组常见操作技巧 (二)”的完整攻略。 JavaScript 数组常见操作技巧 (二) 数组过滤 filter 方法 filter() 方法用于筛选数组中满足条件的元素,返回一个新数组。它需要传入一个函数作为参数,该函数返回一个布尔值,符合条件的元素将被保留,不符合条件的将被剔除。 示例一: const arr …

    other 2023年6月25日
    00
  • vue路由打开新窗口

    Vue路由打开新窗口 在Vue应用中,我们通常会使用Vue Router来管理路由。当用户需要打开一个新窗口时,我们可以使用window.open()方法。但是,当使用Vue Router进行路由管理时,需要注意一些细节。 使用标签打开新窗口 在HTML中,我们可以使用<a>标签来打开新窗口。当需要快速地在应用中加入链接时,这是非常方便的。但是,…

    其他 2023年3月28日
    00
  • win7系统经常死机怎么办?win7系统电脑经常死机的几种原因及解决方法

    Win7系统经常死机怎么办? Win7系统电脑经常死机的问题,可能会给我们的日常使用带来很大的困扰,下面介绍几种原因及相应的解决方法。 原因一:硬件问题 经常死机的原因之一可能是硬件方面的问题,如内存、硬盘等。可以使用以下方法进行故障排查: 内存测试:首先可以尝试使用内存测试软件,如Memtest86等,来测试系统中的内存是否存在问题。 硬盘测试:也可以使用…

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