【LeetCode】-- 二叉搜索树与双向链表

简介: 【LeetCode】-- 二叉搜索树与双向链表

1. 题目

二叉搜索树与双向链表_牛客网

输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的循环双向链表。要求不能创建任何新的节点,只能调整树中节点指针的指向。

2. 示例

3. 分析

1.不是重新构造链表,而是改变搜索二叉树的指针指向,使其成为排序循环链表

2.搜索二叉树是走中序排出来的

3.整个过程需要使用到递归,如何使用递归来解决呢?把搜索二叉树的左右子树期间,让cur的left指向双向链表的prev,prev的right指向cur,这就调整了原来的树结构,再让prev挪到cur的位置,准备下一次递归

 

4. 代码实现

1. /*
2. struct TreeNode {
3.  int val;
4.  struct TreeNode *left;
5.  struct TreeNode *right;
6.  TreeNode(int x) :
7.      val(x), left(NULL), right(NULL) {
8.  }
9. };*/
10. class Solution {
11. public:
12. 
13. //1.中序遍历
14. void InOrder(TreeNode* cur,TreeNode*& prev)//prev加引用,让全局只有一个prev,否则每层都有一个prev,那么上一层就拿不到下一层修改过的prev
15.     {
16. if(cur == nullptr)
17.         {
18. return;
19.         }
20. 
21. InOrder(cur->left,prev);
22.         cur->left = prev;//cur的左指向prev
23. 
24. if(prev)
25.         {
26.             prev->right=cur;//prev的右指向cur
27.         }
28. 
29.         prev = cur;//prev挪到cur的位置,准备下一次递归
30. InOrder(cur->right,prev);
31. 
32.     }
33. 
34. TreeNode* Convert(TreeNode* pRootOfTree) 
35.     {
36. if(pRootOfTree == nullptr)
37.         {
38. return nullptr;
39.         }
40. 
41.         TreeNode* prev = nullptr;
42. InOrder(pRootOfTree,prev);//中序遍历
43. 
44.         TreeNode* head = pRootOfTree;
45. 
46. //找链表头节点
47. while(head->left)
48.         {
49.             head = head->left;
50.         }
51. 
52. return head;
53.     }
54. };


相关文章
|
4天前
|
算法
LeetCode第24题两两交换链表中的节点
这篇文章介绍了LeetCode第24题"两两交换链表中的节点"的解题方法,通过使用虚拟节点和前驱节点技巧,实现了链表中相邻节点的交换。
LeetCode第24题两两交换链表中的节点
|
3天前
|
存储 算法
LeetCode第86题分隔链表
文章介绍了LeetCode第86题"分隔链表"的解法,通过创建两个新链表分别存储小于和大于等于给定值x的节点,然后合并这两个链表来解决问题,提供了一种简单易懂且操作原链表的解决方案。
LeetCode第86题分隔链表
|
3天前
|
存储 算法
LeetCode第83题删除排序链表中的重复元素
文章介绍了LeetCode第83题"删除排序链表中的重复元素"的解法,使用双指针技术在原链表上原地删除重复元素,提供了一种时间和空间效率都较高的解决方案。
LeetCode第83题删除排序链表中的重复元素
|
4天前
|
算法
LeetCode第23题合并 K 个升序链表
这篇文章介绍了LeetCode第23题"合并K个升序链表"的解题方法,使用分而治之的思想,通过递归合并链表的方式解决了这个难题。
LeetCode第23题合并 K 个升序链表
|
3天前
|
算法
LeetCode第96题不同的二叉搜索树
文章介绍了LeetCode第96题"不同的二叉搜索树"的解法,利用动态规划的思想和递推公式,通过计算以任意节点为根的不同二叉搜索树的数量,解决了该问题。
LeetCode第96题不同的二叉搜索树
|
3天前
|
算法
LeetCode第92题反转链表 II
文章分享了LeetCode第92题"反转链表 II"的解法,通过使用四个指针来记录和更新反转链表段的头部、尾部以及前一个和后一个节点,提供了一种清晰且易于理解的解决方案。
LeetCode第92题反转链表 II
|
4天前
|
算法
LeetCode第21题合并两个有序链表
该文章介绍了 LeetCode 第 21 题合并两个有序链表的解法,通过创建新链表,依次比较两个链表的头节点值,将较小的值插入新链表,直至其中一个链表遍历完,再将另一个链表剩余部分接到新链表后面,实现合并。
LeetCode第21题合并两个有序链表
|
4天前
|
算法
LeetCode第19题删除链表的倒数第 N 个结点
该文章介绍了 LeetCode 第 19 题删除链表的倒数第 N 个结点的解法,通过使用快慢双指针,先将快指针移动 n 步,然后快慢指针一起遍历,直到快指针到达链尾,从而找到倒数第 N 个结点的前一个结点进行删除,同时总结了快慢指针可减少链表遍历次数的特点。
LeetCode第19题删除链表的倒数第 N 个结点
|
11天前
|
算法 Java
LeetCode初级算法题:环形链表+排列硬币+合并两个有序数组java解法
LeetCode初级算法题:环形链表+排列硬币+合并两个有序数组java解法
18 0
|
11天前
|
存储 算法 Java
LeetCode初级算法题:反转链表+统计N以内的素数+删除排序数组中的重复项Java详解
LeetCode初级算法题:反转链表+统计N以内的素数+删除排序数组中的重复项Java详解
10 0