【题解】二叉搜索树与双向链表

二叉搜索树与双向链表

题目链接:二叉搜索树与双向链表

解题思路1:递归+中序遍历

首先题目最后要求的是一个的递增的双向链表,而二叉搜索树也是一类非常有特色的树,它的根节点大于所有左侧的节点,同时又小于所有右侧的节点,如果我们按照左中右去遍历这颗二叉树,恰巧得到的就是一个递增序列

题目同时要求不要创建新的节点,这样我们就需要在原有树上进行操作,树有左右节点指针,双向链表有前后两个指针,正好一一对应,我们修改指针指向,结合中序遍历,得到一颗递增的双向链表

代码如下:

cpp 复制代码
	TreeNode* head = nullptr;
	TreeNode* pre = nullptr;
    TreeNode* Convert(TreeNode* pRootOfTree) {
        if(pRootOfTree == nullptr) return nullptr;//递归的结束条件
		Convert(pRootOfTree->left);//递归到最左节点,是最小值
		if(pre == nullptr){
			//此时pRootOfTree是最左节点,是链表的head
			//初始化head和pre
			head = pRootOfTree;
			pre = pRootOfTree;
		}else{
			//pre是每一个pRootOfTree的前驱节点
			pre->right = pRootOfTree;
			pRootOfTree->left = pre;
			pre = pRootOfTree;
		}
		Convert(pRootOfTree->right);
		return head;
    }

解题思路2:非递归+栈

我们利用栈先进后出的特性,来模拟中序遍历出所有元素,先让所有左侧的元素进栈,再依次取出其父节点,再找该节点的右节点,将节点进行连接,连接方式和上一种思路一样

cpp 复制代码
    TreeNode* Convert(TreeNode* pRootOfTree) {
		if(pRootOfTree == nullptr) return nullptr;
        TreeNode* head = nullptr;
		TreeNode* pre = nullptr;
		stack<TreeNode*> s;
		while(pRootOfTree!=nullptr || !s.empty()){
			while(pRootOfTree!=nullptr){
				s.push(pRootOfTree);
				pRootOfTree = pRootOfTree->left;
			}
			pRootOfTree = s.top();
			s.pop();
			if(pre == nullptr){
				head = pRootOfTree;
				pre = pRootOfTree;
			}else{
				pre->right = pRootOfTree;
				pRootOfTree->left = pre;
				pre = pRootOfTree;
			}
			pRootOfTree = pRootOfTree->right;
		}
		return head;
    }
相关推荐
ShineWinsu1 小时前
对于数据结构:链式二叉树的超详细保姆级解析—中
数据结构·c++·算法·面试·二叉树·校招·递归
合方圆~小文1 小时前
高性能20倍变焦球机转动功能监控设备
数据结构·数据库·数码相机·模块测试
这周也會开心2 小时前
Map的遍历方式
数据结构·算法
liu****2 小时前
20.传输层协议TCP
服务器·网络·数据结构·c++·网络协议·tcp/ip·udp
前端小L3 小时前
图论专题(二):“关系”的焦点——一眼找出「星型图的中心节点」
数据结构·算法·深度优先·图论·宽度优先
叫我龙翔3 小时前
【数据结构】从零开始认识B树 --- 高效外查找的数据结构
数据结构·c++·b树
点云SLAM3 小时前
C++ 中的栈(Stack)数据结构与堆的区别与内存布局(Stack vs Heap)
开发语言·数据结构·c++·内存布局·栈数据结构·c++标准算法·heap内存分配
前端小L4 小时前
图论专题(六):“隐式图”的登场!DFS/BFS 攻克「岛屿数量」
数据结构·算法·深度优先·图论·宽度优先
-大头.4 小时前
Python数据结构之旅:09-图论基础——连接万物的网络
数据结构·图论
flashlight_hi5 小时前
LeetCode 分类刷题:1669. 合并两个链表
javascript·leetcode·链表