当前位置: 首页 > news >正文

牛客网剑指Offer-树篇-JZ36 二叉搜索树与双向链表

题目

来源:JZ36 二叉搜索树与双向链表
描述
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。如下图所示
在这里插入图片描述

数据范围:输入二叉树的节点数 0≤n≤1000,二叉树中每个节点的值 0≤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
树的形状如上图

解析

基础:空间O(n)
原地操作还是有一定难度的,所以空间O(n)的解法还是很有价值的。正如我在二叉搜索树的第k个节点中所说的,中序遍历BST即可得到升序数组。所以只需中序遍历BST,同时创建节点即可,但这里有个坑:链表是动态创建的,所以一般需要额外创建一个头节点来使操作更方便,或保存当前节点的上一节点也行,这里用前者。

TreeNode* head, *q;
void InOrderTrav(TreeNode* p) {if (!p) return;InOrderTrav(p->left);TreeNode* tmp = new TreeNode(p->val);q->right = tmp;tmp->left = q;q = q->right;InOrderTrav(p->right);
}
TreeNode* Convert(TreeNode* root) {if (!root) return NULL;head = new TreeNode(0);q = head;InOrderTrav(root);head->right->left = NULL;return head->right;
}

进阶:空间O(1)
如果不能创建新节点,则需要额外的指针,这个指针的作用很容易想到,就是保存上一节点,所以总共需要两个额外指针:head,pre。现在有个难点:head如何指向第一个节点?由于递归的性质,当递归到树的最左下节点时,当前节点即第一个节点,所以我们需要在递归左右子树之间对head的值行判断:假设head初始值是空,那么当head为空时,使head指向当前节点,pre再指向head,否则链接当前节点和pre。注意题目要求返回head,所以在递归完左右子树后,要返回head。

TreeNode* head = NULL, *pre;
TreeNode* Convert(TreeNode* p) {if (!p) return NULL;Convert(p->left);if (!head) {head = p;pre = head;} else {pre->right = p;p->left = pre;pre = p;}Convert(p->right);return head;
}

http://www.mrgr.cn/news/66349.html

相关文章:

  • 我们来学mysql -- 访问方法(原理篇)
  • 多核架构的基本概念
  • okcc呼叫中心语音通知模式播放的语音是否可以被录音?
  • YOLOv10改进策略【卷积层】| CVPR-2024 利用DynamicConv 动态卷积 结合C2fCIB进行二次创新,提高精度
  • 大模型微调技术 --> 脉络
  • Flutter UI架构(3)
  • web——[ACTF2020 新生赛]Exec1——命令注入
  • Spring cloud
  • 探索Java与C++中的类成员访问修饰符:从默认设置到封装实践
  • K8S简单部署,以及UI界面配置
  • 2024年Q3企业邮箱安全性研究报告:钓鱼邮件攻击同比上涨102.3%
  • 揭秘rust中默认参数类型不为人知的秘密,你确定不来了解下吗?
  • 华为 HarmonyOS NEXT 原生应用开发: 动画的基础使用(属性、显示、专场)动画
  • 从零开始的LeetCode刷题日记:746. 使用最小花费爬楼梯
  • 十月末
  • Nginx配置文件编写示例
  • Java中查找与排序算法探究
  • 阿里云服务器 篇十(加更):自动定时备份CSDN博客内容:优化内存和解决图片展示等问题
  • 5分钟上手 Kubernetes:精简实用的 Kubectl 命令速查宝典!
  • 【ESP32+MicroPython】热点模式及网页控制
  • 产品增长之付费推广
  • 光伏设计软件如何快速上手?
  • 【万字详文介绍】:迭代扩张卷积神经网络(IDCNN)
  • 模拟实现C库函数~
  • 【OJ题解】在字符串中查找第一个不重复字符的索引
  • 华为HarmonyOS借助AR引擎帮助应用实现虚拟与现实交互的能力5-识别平面语义