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

二叉树深度学习——将二叉搜索树转化为排序的双向链表

1.题目解析

题目来源:LCR 155.将二叉搜索树转化为排序的双向链表

测试用例

2.算法原理

首先题目要求原地进行修改并且要求左指针代表前驱指针,右指针代表后继指针,所以思路就是

1.使用前序遍历创建两个指针cur、prev代表当前节点与前一个节点,然后将前一个节点的后继指向当前节点,当前节点的前驱指向上一个节点即可,需要注意的是第一次不能访问前一个节点,因为前一个节点一开始为空,避免对空指针进行操作

2.然后通过创建一个节点head = root,此时root这棵树已经前序遍历完成,使用不断地head =head->left最终访问到root这棵树的最小节点,然后将最小节点的前驱指向最大节点,最大节点的后继指向最小节点,完成循环链表的操作

3.实战代码

/*
// Definition for a Node.
class Node {
public:int val;Node* left;Node* right;Node() {}Node(int _val) {val = _val;left = NULL;right = NULL;}Node(int _val, Node* _left, Node* _right) {val = _val;left = _left;right = _right;}
};
*/
class Solution {
public:void InOrder(Node* cur,Node*& prev){if(cur == nullptr){return;}InOrder(cur->left,prev);//创建两个指针,不断中序遍历修改指针cur->left = prev;//第一次的prev为空,避免对空指针进行访问if(prev){prev->right = cur;}//更新后继续中序遍历prev = cur;InOrder(cur->right,prev);}Node* treeToDoublyList(Node* root) {if(root == nullptr){return nullptr;}Node* prev = nullptr;InOrder(root,prev);//通过不断向左递归找到最小的节点Node* head = root;while(head->left){head = head->left;}//将最左边的节点的前驱指向最右边节点//最右边节点的后继指向最左边节点head->left = prev;prev->right = head;return head;}
};

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

相关文章:

  • TypeScript面向对象 02
  • 特别节目————集训总结
  • AQS原理(AbstractQueuedSynchronizer)
  • 若依使用(二次开发)
  • 152. 乘积最大子数组
  • 国外电商系统开发-运维系统添加拓扑节点
  • 知识图谱入门——10:使用 spaCy 进行命名实体识别(NER)的进阶应用:基于词袋的实体识别与知识抽取
  • (Linux驱动学习 - 6).Linux中断
  • 【ECMAScript 从入门到进阶教程】第二部分:中级概念(面向对象编程,异步编程,模块化,try/catch 语句)
  • visual studio使用ssh连接linux虚拟机运行程序
  • 【OAuth 2.0】使用与更新
  • 引领5G驱动的全球数字营销革新:章鱼移动广告全球平台的崛起
  • MVCC(多版本并发控制)
  • 易盾新版滑块分析
  • 第十三届蓝桥杯嵌入式省赛程序设计题解析(基于HAL库)(第一场)
  • 文件路径、文件系统操作、字节流字符流、文件内容操作、自己实现文件查找 删除 复制、IO报错:拒绝访问
  • 七、Drf版本组件
  • 举例说明 .Net Core 单元测试中 xUnit 的 [Theory] 属性的用法
  • [C++]使用纯opencv部署yolov11-seg实例分割onnx模型
  • 大数据实时数仓Hologres(四):基于Flink+Hologres搭建实时数仓