<刷题笔记> 二叉搜索树与双向链表注意事项

二叉搜索树与双向链表_牛客题霸_牛客网 (nowcoder.com)

根据题意,我们需要将搜索二叉树转换成有序的形式。

重点一:BST的中序遍历一定是有序的

因此,此题无论如何都需要使用中序。

又因为要求原地算法,所以:

重点二:中序遍历的第一个节点就是最左的节点,在走到最左节点之前,prev都应该指向nullptr

所以只有在遍历到节点之后,才需要让prev=cur,之前的向左递归的步骤都不需要也不能让prev跟上cur的值。

实现代码如下:

cpp 复制代码
class Solution {
public:
    void Inorder(TreeNode* cur,TreeNode*& prev){/*cur是在递归的中序遍历,所以一定不传引用,而prev必须一直传引用*/
		if(cur==nullptr){
		   //prev = cur;
           return ;
		}
		//prev = cur;
		Inorder(cur->left,prev);

        //prev表示的是当前遍历节点的上一个有效位置
		cur->left = prev;
		if(prev) prev->right = cur;
		prev = cur ;

		Inorder(cur->right,prev);
	}
    TreeNode* Convert(TreeNode* pRootOfTree) {
		if(pRootOfTree==nullptr) return nullptr;
        TreeNode* cur = pRootOfTree;
		TreeNode* prev = nullptr;
		Inorder(cur,prev);

		TreeNode* head = pRootOfTree;
		while(head->left){
			head = head->left;
		}
		return head;
    }
};

重点三:关于在递归中设计不递归的变量

cur作为中序遍历的对象,在递归过程中一直使用传值传参

而prev作为非递归对象,需要他一直保持一个值,所以一定使用传引用传参。

相关推荐
wdfk_prog21 小时前
[Linux]学习笔记系列 -- [fs]libfs
linux·笔记·学习
持梦远方21 小时前
持梦行文本编辑器(cmyfEdit):架构设计与十大核心功能实现详解
开发语言·数据结构·c++·算法·microsoft·visual studio
中屹指纹浏览器21 小时前
2025边缘计算与本地指纹生成技术:浏览器指纹安全与抗检测方案解析
经验分享·笔记
航Hang*21 小时前
Photoshop 图形与图像处理技术——第3章:图像的选择与填充
图像处理·笔记·ui·photoshop
im_AMBER21 小时前
Leetcode 90 最佳观光组合
数据结构·c++·笔记·学习·算法·leetcode
QT 小鲜肉21 小时前
【Linux命令大全】001.文件管理之paste命令(实操篇)
linux·运维·服务器·笔记·microsoft
爱睡觉的王宇昊1 天前
PCB设计完全指南:从软件选择到基础规范(通用电路篇详解)
笔记·stm32·单片机·嵌入式硬件·学习
点云SLAM1 天前
boost中graph_traits和adjacency_list 的内存布局以及最小图示例
数据结构·数据库·图论·boost库·最小图·链接矩阵·graph_traints技术
代码游侠1 天前
应用——Linux Socket编程
运维·服务器·开发语言·笔记·网络协议·学习
自信150413057591 天前
数据结构初阶之单链表
c语言·数据结构