【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. };


相关文章
|
1月前
【力扣】-- 移除链表元素
【力扣】-- 移除链表元素
35 1
|
1月前
【LeetCode 45】701.二叉搜索树中的插入操作
【LeetCode 45】701.二叉搜索树中的插入操作
9 1
|
1月前
【LeetCode 44】235.二叉搜索树的最近公共祖先
【LeetCode 44】235.二叉搜索树的最近公共祖先
17 1
|
1月前
【LeetCode 48】108.将有序数组转换为二叉搜索树
【LeetCode 48】108.将有序数组转换为二叉搜索树
38 0
|
1月前
【LeetCode 47】669.修剪二叉搜索树
【LeetCode 47】669.修剪二叉搜索树
10 0
|
1月前
【LeetCode 46】450.删除二叉搜索树的节点
【LeetCode 46】450.删除二叉搜索树的节点
15 0
|
1月前
【LeetCode 42】501.二叉搜索树中的众数
【LeetCode 42】501.二叉搜索树中的众数
8 0
|
1月前
【LeetCode 41】530.二叉搜索树的最小绝对差
【LeetCode 41】530.二叉搜索树的最小绝对差
11 0
|
1月前
【LeetCode 40】98.验证二叉搜索树
【LeetCode 40】98.验证二叉搜索树
11 0
|
1月前
【LeetCode 39】700.二叉搜索树中的搜索
【LeetCode 39】700.二叉搜索树中的搜索
14 0