二叉树刷题——递归

news2024/10/7 6:41:17

JZ36 二叉搜索树与双向链表(牛客)

描述

输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。如下图所示

数据范围:输入二叉树的节点数 0≤10000≤n≤1000,二叉树中每个节点的值 0≤10000≤val≤1000
要求:空间复杂度O(1)(即在原树上操作),时间复杂度O(n)

注意:

1.要求不能创建任何新的结点,只能调整树中结点指针的指向。当转化完成以后,树中节点的左指针需要指向前驱,树中节点的右指针需要指向后继
2.返回链表中的第一个节点的指针
3.函数返回的TreeNode,有左右指针,其实可以看成一个双向链表的数据结构

4.你不用输出双向链表,程序会根据你的返回值自动打印输出

输入描述:

二叉树的根节点

返回值描述:

双向链表的其中一个头节点。

示例1

输入:

{10,6,14,4,8,12,16}

复制返回值:

From left to right are:4,6,8,10,12,14,16;From right to left are:16,14,12,10,8,6,4;

复制说明:

输入题面图中二叉树,输出的时候将双向链表的头节点返回即可。     

示例2

输入:

{5,4,#,3,#,2,#,1}

复制返回值:

From left to right are:1,2,3,4,5;From right to left are:5,4,3,2,1;

复制说明:

                    5
                  /
                4
              /
            3
          /
        2
      /
    1
树的形状如上图      

知识点1:二叉树递归

递归是一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解。因此递归过程,最重要的就是查看能不能讲原本的问题分解为更小的子问题,这是使用递归的关键。

而二叉树的递归,则是将某个节点的左子树、右子树看成一颗完整的树,那么对于子树的访问或者操作就是对于原树的访问或者操作的子问题,因此可以自我调用函数不断进入子树。

知识点2:二叉搜索树

二叉搜索树是一种特殊的二叉树,它的每个节点值大于它的左子节点,且大于全部左子树的节点值,小于它右子节点,且小于全部右子树的节点值。因此二叉搜索树一定程度上算是一种排序结构。

思路:

二叉搜索树最左端的元素一定最小,最右端的元素一定最大,符合“左中右”的特性,因此二叉搜索树的中序遍历就是一个递增序列,我们只要对它中序遍历就可以组装称为递增双向链表。

具体做法:

  • step 1:创建两个指针,一个指向题目中要求的链表头(head),一个指向当前遍历的前一节点(pre)。
  • step 2:首先递归到最左,初始化head与pre。
  • step 3:然后处理中间根节点,依次连接pre与当前节点,连接后更新pre为当前节点。
  • step 4:最后递归进入右子树,继续处理。
  • step 5:递归出口即是节点为空则返回。
举一反三:

BM34. 判断是不是二叉搜索树

BM37. 二叉搜索树的最近公共祖先

 

class Solution {
public:
	TreeNode* head=nullptr;
	TreeNode* pre=nullptr;
    TreeNode* Convert(TreeNode* pRootOfTree) {
        if(pRootOfTree==nullptr)
		{
			return nullptr;
		}
		Convert(pRootOfTree->left);
		if(pre==nullptr)
		{
			pre=pRootOfTree;
			head=pRootOfTree;
		}
		else {
			pre->right=pRootOfTree;
			pRootOfTree->left=pre;
			pre=pRootOfTree;
		}
		Convert(pRootOfTree->right);
		return head;
    }
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1167838.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Android 11 Framework 增加自定义API到系统中

基于 Android 11 源码 根据网上的教程, 自己先捣鼓一波: frameworks\base\services 创建 hzyd文件夹 Android.bp内容: android_library_import {name: "services.hzyd",aars: ["MobileSDK-release.aar"],sdk_version: "current", }修改 fra…

携程AI布局:三重创新引领旅游行业智能化升级

2023年10月24日,携程全球合作伙伴峰会在新加坡召开,携程集团联合创始人、董事局主席梁建章做了名为《旅游业是独一无二的最好的行业》的演讲,梁建章在演讲中宣布了携程生成式 AI、内容榜单、ESG 低碳酒店标准三重创新的战略方向。这些创新将为…

Python 获取cpu、内存利用率

获取cpu、内存利用率 # -*- coding: latin1 -*- import psutil cpuPercent 0 psutil.cpu_percent() while True:vm psutil.virtual_memory()memoryPercent vm.percentcpuPercent psutil.cpu_percent(1) *10print("cpuPercent:"str(cpuPercent)" %")prin…

三、IPSec VPN原理

IPSec 1、IPSec起源和定义2、IPSec原理2.1、IPSec协议框架2.1.1、安全联盟2.1.2、安全协议2.1.3、安全协议报文头结构2.1.4、封装模式2.1.5、加密和验证2.1.6、IKE安全机制 2.2、IPSec基本原理2.2.1、定义IPSec保护的数据流2.2.2、IKEv2协商安全联盟的过程 2.3、IPSec增强原理2…

java配置GDAL

<gdal.version>3.7.0</gdal.version><!-- gdal--><dependency><groupId>org.gdal</groupId><artifactId>gdal</artifactId><version>${gdal.version}</version></dependency> GDAL环境安装 downlo…

华为OD机试 - 数组组成的最小数字 - 逻辑分析(Java 2023 B卷 100分)

目录 专栏导读一、题目描述二、输入描述三、输出描述四、解题思路五、Java算法源码六、效果展示1、输入2、输出3、说明 华为OD机试 2023B卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&#xff08;A卷B卷&#…

考研数据结构线性表看这篇就够了之顺序表(一)

目录 一.线性表 1.1 线性表的概念 1.2线性表的种类 1.2.1 静态线性表 1.2.2 线性表的动态存储 二动态顺序表的操作 2.1. 定义结构体与函数 2.2 初始化 2.2.1实参和形参的区别 2.2.2 用实参改变形参 题外话 int *p和int* p的区别 2.3 销毁 2.4 尾插 2.4.1 首先要判…

继承、菱形继承与虚拟继承

继承、菱形继承与虚拟继承 一、概念二、定义格式三、继承方式四、派生类继承基类成员访问方式的变化五、基类和派生类对象赋值转换1、概念2、示意图3、示例代码4、特点 六、继承中的作用域1、概念2、示例代码3、运行结果 七、派生类的默认成员函数1、调用方法2、示例代码3、运行…

【LeetCode刷题-排序】--147.对链表进行插入排序

147.对链表进行插入排序 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}* ListNode(int val) { this.val val; }* ListNode(int val, ListNode next) { this.val val; this.next next; }…

必须收藏:IPv6核心知识梳理!!(原理+基础配置)

一、概述 由于NAT技术的应用&#xff0c;缓解了IPv4地址不足产生的问题&#xff0c;但是部署IPv6是解决IPv4地址不足的最终方案。当前世界上不同地区对部署IPv6的需求强烈程度不一&#xff0c;且当前IPv4网络仍然占主流地位&#xff0c;因此短时间内IPv6和IPv4将会共存。 IPv4网…

深入理解网络IO复用并发模型

本文主要介绍服务端对于网络并发模型以及Linux系统下常见的网络IO复用并发模型。文章内容一共分为两个部分。 第一部分主要介绍网络并发中的一些基本概念以及我们Linux下常见的原生IO复用系统调用&#xff08;epoll/select&#xff09;等。第二部分主要介绍并发场景下常见的网…

opencv dnn模块 示例(21) 目标检测 object_detection 之 yolov6

文章目录 1、YOLOv6介绍1.1、概述1.2、关键技术1.2.0、网络结构1.2.1、表征能力更强的 RepBi-PAN Neck 网络1.2.2、全新的锚点辅助训练&#xff08;Anchor-Aided Training&#xff09;策略1.2.3、无痛涨点的 DLD 解耦定位蒸馏策略 1.3、总结 2、测试2.1、官方项目测试2.2、open…

View绘制流程

在子线程中不能更新UI的前提是不触发 checkThread ,逐步委托给mParent检查线程 onCreate加载contentView 进行draw onStart onResume 可能也没有完成测量流程 setContentView: public abstract void setContentView(LayoutRes int resId); Activity 是由ActivityThread类中…

Linux友人帐之网络编程基础DNS服务器

一、DNS服务器 1.1概述 DNS&#xff08;Domain Name System&#xff09;是一种分布式系统&#xff0c;用于将域名映射到IP地址。它是互联网上的基础设施之一&#xff0c;作为一种网络协议&#xff0c;它将域名转换为对应的IP地址。DNS的主要功能是将易于记忆的域名转换为计算机…

Brave Game(博弈论巴什博弈)

Problem - 1846 #include<bits/stdc.h> using namespace std; int t,n,m; signed main(){scanf("%d",&t);while(t--){scanf("%d%d",&n,&m);if(n%(m1)0) puts("second");else puts("first");}return 0; }

【带头学C++】----- 三、指针章 ---- 3.7 数组指针

3.7 数组指针 1.数组指针的概述 数组指针是一个指向数组的指针变量&#xff0c;是用来保存数组元素的地址。在C/C中&#xff0c;数组名代表了数组的首地址&#xff0c;可以被解释为一个指向数组第一个元素的指针。因此&#xff0c;一个指向数组的指针可以通过数组名来获…

安达发|APS智能优化排产软件的优先级应用

在制造业中&#xff0c;订单排产是一个重要的环节&#xff0c;它直接影响到生产效率、交货期和客户满意度。为了提高订单排产的效率和准确性&#xff0c;许多企业开始采用APS&#xff08;高级计划与排产&#xff09;智能优化排产软件。APS软件可以根据企业的生产资源、订单需求…

人大女王大学金融硕士项目——披星戴月走过的路,一定可以繁花满地

道路是曲折的&#xff0c;前途是光明的&#xff0c;在路上多花点时间到达才更有意义&#xff0c;作为身经百炼的职场人士&#xff0c;也难免遇到瓶颈期。这个时候&#xff0c;如果不改变自己&#xff0c;就很容易陷入焦虑。而在职读研便是一个很好的方式&#xff0c;一遍学习&a…

未来架构:无服务器计算和容器的融合

文章目录 无服务器计算&#xff1a;构建和扩展应用的新方式优势&#xff1a;示例代码&#xff1a; 容器技术&#xff1a;实现跨环境一致性优势&#xff1a;示例代码&#xff1a; 无服务器与容器的融合优势&#xff1a;示例代码&#xff1a; 未来架构的挑战和展望结论 &#x1f…