【剑指Offer】【树】【双向链表】二叉搜索树与双向链表

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

 

A:二叉树中每个节点都有一个left指针指向左节点,一个right指针指向右节点

  双向链表中每个节点都有一个prev指针指向前驱节点,一个next指针指向后继节点

  在二叉搜索树中,左节点小于父节点,右节点大于父节点;

  在排序双向链表中,前驱节点小于当前节点,后继节点大于当前节点

得到以下转化方案:

  中序遍历二叉搜索树

 

  转化当前节点的左节点converTree(pTree->left, prev);  

 

  找到当前节点pTree,pTree->left = prev

  如果prev不为空,则prev->next = pTree

  prev = prev->next往后移动

 

  转化当前节点的右节点

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
/*
struct TreeNode {
    int val;
    struct TreeNode *left;
    struct TreeNode *right;
    TreeNode(int x) :
            val(x), left(NULL), right(NULL) {
    }
};*/
class Solution {
public:
    void converTree(TreeNode * pTree, TreeNode *&prev)    //二级指针 = 指针引用  (降级,可以直接用pre操作,否则要*pre)
    {
        if(pTree == nullptr)
        {
            return ;
        }
        converTree(pTree->left, prev);
         
        pTree->left = prev;
        if(prev != nullptr)
        {
            prev->right = pTree;
        }
        prev = pTree;
         
        converTree(pTree->right, prev);
    }
    TreeNode* Convert(TreeNode* pRootOfTree)
    {
        if(pRootOfTree == nullptr)
        {
            return nullptr;
        }
        TreeNode *pTree = nullptr;
        //转化
        converTree(pRootOfTree,pTree);
        //输出头节点
        TreeNode *ret = pRootOfTree;
        while(ret->left != nullptr)
        {
            ret = ret->left;
        }
        return ret;
    }
};

  

 

 

posted @   XieXinBei0318  阅读(699)  评论(0编辑  收藏  举报
编辑推荐:
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· C++代码改造为UTF-8编码问题的总结
阅读排行:
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· 【.NET】调用本地 Deepseek 模型
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
· 上周热点回顾(2.17-2.23)
· 如何使用 Uni-app 实现视频聊天(源码,支持安卓、iOS)
点击右上角即可分享
微信分享提示