【剑指offer】24.二叉搜索树与双向链表

总目录:

算法之旅导航目录

 

1.问题描述

输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。如下图所示 

 

 

 

 

数据范围:输入二叉树的节点数 0≤n≤1000,二叉树中每个节点的值 0≤val≤1000
要求:空间复杂度O(1)即在原树上操作),时间复杂度 O(n)
注意:
1.要求不能创建任何新的结点,只能调整树中结点指针的指向。当转化完成以后,树中节点的左指针需要指向前驱,树中节点的右指针需要指向后继
2.返回链表中的第一个节点的指针
3.函数返回的TreeNode,有左右指针,其实可以看成一个双向链表的数据结构
4.你不用输出双向链表,程序会根据你的返回值自动打印输出
 

2.问题分析

 1递归,左右分别递归,然后按规则将root节点与左侧的最后一个节点互相绑定,将root与右侧的第一个节点互相绑定


3.代码实例

递归

 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     TreeNode* Convert(TreeNode* pRootOfTree) {
13         if (!pRootOfTree) {
14             return NULL;
15         }
16 
17         //叶子节点
18         if (pRootOfTree->left == NULL && pRootOfTree->right == NULL) {
19             return pRootOfTree;
20         }
21 
22         //向左绑定
23         TreeNode* leftHead = Convert(pRootOfTree->left);
24         if (leftHead) {
25             while (leftHead->right) {
26                 leftHead = leftHead->right;
27             }
28             leftHead->right = pRootOfTree;
29         }
30         pRootOfTree->left = leftHead;
31 
32         //向右绑定
33         TreeNode* rightHead = Convert(pRootOfTree->right);
34         if (rightHead) {
35             rightHead->left = pRootOfTree;
36         }
37         pRootOfTree->right = rightHead;
38 
39 
40         //从双向链表中找到首节点
41         TreeNode* head = pRootOfTree;
42         while (head->left) {
43             head = head->left;
44         }
45         return head;
46     }
47 };
View Code

 

posted @ 2022-11-12 22:22  啊原来是这样呀  阅读(23)  评论(0)    收藏  举报