首页 > 编程语言 >编程题-最小高度树

编程题-最小高度树

时间:2025-01-17 17:30:01浏览次数:3  
标签:TreeNode 编程 高度 最小 二叉 二叉树 left root 指针

题目:

给定一个有序整数数组,元素各不相同且按升序排列,编写一个算法,创建一棵高度最小的二叉搜索树。

解法一(二分查找+二叉搜索树构建):

二叉搜索树的中序遍历是升序序列,题目给定的数组是按照升序排列的有序数组,因此可以确保数组是二叉搜索树的中序遍历序列。二叉搜索树中,左子树的值要小于根节点的值要小于右子树的值,因此选择二分查找的方式选取升序数组序列中的元素,选择中间位置右边的数组作为根节点,根节点的下标为mid=(left+right+1)/2,此处的除法为整数除法。如下为笔者代码:

class Solution {
public:
    //采用TreeNode*& root来索引二叉树,将二分查找的中间元素作为跟节点添加到二叉搜索树中
    //将中间元素的左子数组序列作为左子树创建新的二叉搜索树,将中间元素的右子数组序列作为右子树创建新的二叉搜索树。
    //TreeNodeInsert递归函数的执行条件是left<=right,仅填了left=right时的最后一个元素作为根节点元素,不再执行递归函数体中的递归内容
    void TreeNodeInsert(TreeNode*& root, vector<int>& nums, int left, int right){
        int T = (left+right+1)/2;
        if(root==nullptr){
            root = new TreeNode(nums[T]);
        }
        if(left<=T-1 and root->left==nullptr){
            TreeNodeInsert(root->left, nums,left, T-1);
        }
        if(T+1<=right and root->right==nullptr){
            TreeNodeInsert(root->right, nums,T+1,right);
        }
    }
    TreeNode* sortedArrayToBST(vector<int>& nums) {
        int length = nums.size();
        int T = length/2;
        int left = 0;
        int right = length-1;
        if(length==0){
            return nullptr;
        }
        创建的left和right两个指针为子升序数组的首部和尾部索引值
        TreeNode* root = nullptr;
        TreeNodeInsert(root, nums,left,right);
        return root;
    }
};

时间复杂度:O(n),其中 n 是数组的长度。每个数字只访问一次。

空间复杂度:O(logn),其中 n 是数组的长度。空间复杂度不考虑返回值,因此空间复杂度主要取决于递归栈的深度,递归栈的深度是 O(logn)。

笔者小记:

1、创建一个新的空二叉树,TreeNode* root = nullptr;必须加*指针,否则会产生错误。

2、创建二叉树的索引TreeNode*& root,后续对root的修改则会直接修改原来的二叉树,必须加&引用符号,否则后续对root的修改只会改变函数体内的root二叉树,不能对函数体外root二叉树内容进行修改。

TreeNode*& root是一个引用类型的指针参数,它表示传递的是指向TreeNode*的引用,当传递给函数时,函数内部可以直接修改原始root指针的值,甚至可以改变它指向的地址,对指针指向的内存地址和变量的任何修改都将反映在原始的指针上。

TreeNode* root是一个普通的指针类型参数,表示传递的是TreeNode*类型的值(即一个指针副本)。在函数内部,可以修改指针所指向的内容,但是修改指针本身(例如指向其他内存地址)并不会影响原始的root指针。简单来说,函数内对指针的修改仅限于局部作用域,外部的root不会受到影响。

3、如果要在小记1、中root空二叉树的基础上增加根节点代码为root = new TreeNode(value);采用new创建二叉树节点,此时TreeNode* root !=nullptr,将不再为空。

之前题目涉及到的都是二叉树和二叉搜索树的遍历,本次题目与之前二叉树相关的都不相同,涉及到的是二叉树的创建和新增根节点操作代码,需特别关注和记录。

标签:TreeNode,编程,高度,最小,二叉,二叉树,left,root,指针
From: https://blog.csdn.net/qq_43287713/article/details/145113948

相关文章

  • java 函数式编程
    1函数式创建对象new接口或抽象类时在花括号里面补全缺失的函数体可以创建匿名子类对象(非子类匿名对象)new普通类时在花括号里面直接重写方法可以创建匿名子类对象(非子类匿名对象)2lumbda表达式创建对象在函数式创建对象的基础上当接口或抽象类中仅有一个方法缺少函数体时可以......
  • 编程语言也给你挑上了
    现在的实习生都这么趾高气扬啦,会个java给你骄傲上了?上月组里调来了个实习生,说是上个导师训不服他。据说还是老板看上的可塑之才,有过独立游戏的开发经验。我倒是看看是个什么天才。听前科室说,这小子规范一塌糊涂。代码一堆嵌套,能省的全省了,隔着大肠包小肠呢,说自己一直都这么写......
  • 如何入门编程
    编程入门之路:从新手到开发者编程就像学习一门新语言,最开始总是有些让人畏惧。但当你开始理解那些字母组合的真正含义时,便会领悟到其美妙之处。那么,你准备好踏上这条旅程了吗?今天,我们将一起探讨如何顺利入门编程,打下坚实的基础,最终成为一名出色的开发者。选择合适的编程语......
  • 【无人机】基于一组配备图像传感器的无人驾驶飞行器(UAV)对地面区域进行最小时间覆盖问
     ......
  • Java编程思想第四版第十五章第8题(java中的一些基本概念)
    1.编程题目概况这是Java编程思想(第四版)第十五章中的编程作业题第8题,原文如下:练习8.模仿Coffee示例的样子,根据你喜爱的电影人物,创建一个StoryCharacters的类层次结构,将它们划分为GoodGuys和BadGuys.再按照CoffeeGenerator的形式,编写一个StoryCharacters的生成......
  • 28、【OS】【Nuttx】最小系统初始化分析(4):定时器(二)
    背景接上篇wiki27、【OS】【Nuttx】最小系统初始化分析(4):定时器(一)分析了定时器初始化过程,以及初始化生成的定时器实例,并着重分析了实例对象里的sim_current方法,接下来对最小系统中,定时器的启动,以及执行的任务进行分析定时器启动来看定时器启动函数sim_start,这里有两......
  • Haskell语言的编程范式
    Haskell语言的编程范式及其魅力引言Haskell是一种纯粹的函数式编程语言,自1987年首次发布以来,它一直在学术界和工业界保持着相对高的关注度。Haskell的编程范式与传统的命令式编程有着显著的不同,提供了一种更加优雅和强大的方式来处理计算和数据。本文将详细探讨Haskell语......
  • day03循环基础编程练习
    1.汽车牌照号码由字母和数字随机组成,长度为5位随机的字母和数字组合,可以通UUID.randomUUID().toString()产生。每次产生后,由用户决定是否继续产生?(Y/N),如果输入Y后,则继续生成;如果用户输入N,程序结束。packagehomework;/*●汽车牌照号码由字母和数字随机组成,长度为5位●......
  • C语言数据结构编程练习-单向不带头链表的操作
    单向链表单向链表是由若干个节点组成的数据结构,每个节点包含两个部分:数据域和指针域。数据域存储节点的数据,指针域存储下一个节点的地址。  #include"03.h"voidfn3(){ intorder=0; elementTypeval; elementTypeelementVal; LinkNode*ListNode=NULL; ......
  • C语言数据结构编程练习-用指针创建顺序表,进行创销和增删改查操作
     使用多文件进行编程main.c文件#include"02.h"intmain(){ fn2(); return0;} 02.h 头文件#pragmaonce#define_CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<stdlib.h>#include<memory.h>#defineMAX_NUMBER100typedefi......