剑指offer 二叉搜索树与双向链表

题目:

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

代码:

复制代码
 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     {
14         if( pRootOfTree == NULL)
15             return pRootOfTree;
16         if( pRootOfTree->left == NULL && pRootOfTree->right == NULL )
17             return pRootOfTree;
18         TreeNode* head = new TreeNode(NULL);
19         //右子树递归(大于根节点的结点)
20         head = Convert(pRootOfTree->right);
21         if(head != NULL){
22             head->left = pRootOfTree;
23             pRootOfTree->right = head;
24         }
25         //左子树递归(小于根节点的结点)
26         head = Convert(pRootOfTree->left);
27         if(head != NULL){
28             //此处循环为了找到该子树下最大结点并与此子树根节点相连
29             while(head->right != NULL)
30                 head = head->right;
31             head->right = pRootOfTree;
32             pRootOfTree->left = head;
33         }
34         //当此子树的左右枝都排列完毕时,找到最小结点为与根节点相连
35         while(pRootOfTree->left != NULL)
36             pRootOfTree = pRootOfTree->left;
37         return pRootOfTree;
38     }
39 };
复制代码

我的笔记:

  根据二叉搜索树的性质,排列整个双向链表时需要注意,每个子树在回溯到根结点时,要确保返回值,是当前链表的最值,如左子树要返回当前最右(大)结点,右子树要返回当前最左(小)结点。

posted @   John_yan15  阅读(131)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示