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

简介: 剑指offer 37. 二叉搜索树与双向链表

题目描述

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

要求不能创建任何新的结点,只能调整树中结点指针的指向。

注意


  • 需要返回双向链表最左侧的节点。

例如,输入下图中左边的二叉搜索树,则输出右边的排序双向链表

数据范围

树中节点数量 [0,500]。


方法一:dfs O(n)

我们可以利用中序遍历的性质,设置一个 prev 指针,在遍历过程中,改变 prevroot 指针指向从而得到最终结果。

我们拿题目的样例举例,看看具体是如何实现的:




1ef89f18d5f040c0bb11c9b563dffd95.png


第一步: 调用 dfs 会先一直往左结点进行递归,直到最左结点 4 。由于 prevNULL ,所以 4left 指向空。

第二步: 回溯到结点 6 ,此时 prev 指向结点 4 ,那么只用将当前结点的左指针指向上个结点,将上个结点的右指针指向当前结点即可。


第三步: 继续递归其右结点,并按照上述操作进行。

第四步 ~ 第七步: 同样按照步骤二进行操作。

第八步: 返回最终链表。

dc65823006c94f6b83229f7b090df4e2.png

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    TreeNode* prev = NULL;
    void dfs(TreeNode* root)
    {
        if (!root)   return;
        dfs(root->left);
        root->left = prev;
        if (prev)    prev->right = root;
        prev = root;
        dfs(root->right);
    }
    TreeNode* convert(TreeNode* root) {
        dfs(root);
        while (root && root->left)   root = root->left;
        return root;
    }
};

欢迎大家在评论区交流~

目录
相关文章
|
2月前
(剑指offer)18、删除链表的节点—22、链表中倒数第K个节点—25、合并两个排序的链表—52、两个链表的第一个公共节点(2021.12.07)
(剑指offer)18、删除链表的节点—22、链表中倒数第K个节点—25、合并两个排序的链表—52、两个链表的第一个公共节点(2021.12.07)
56 0
|
4月前
|
Python
【Leetcode刷题Python】剑指 Offer 22. 链表中倒数第k个节点
Leetcode题目"剑指 Offer 22. 链表中倒数第k个节点"的Python解决方案,使用双指针法找到并返回链表中倒数第k个节点。
55 5
|
4月前
|
Python
【Leetcode刷题Python】剑指 Offer 18. 删除链表的节点
Leetcode题目"剑指 Offer 18. 删除链表的节点"的Python解决方案,通过使用双指针法找到并删除链表中值为特定数值的节点,然后返回更新后的链表头节点。
46 4
|
7月前
【一刷《剑指Offer》】面试题 17:合并两个排序的链表
【一刷《剑指Offer》】面试题 17:合并两个排序的链表
|
7月前
【一刷《剑指Offer》】面试题 16:反转链表
【一刷《剑指Offer》】面试题 16:反转链表
|
7月前
【一刷《剑指Offer》】面试题 15:链表中倒数第 k 个结点
【一刷《剑指Offer》】面试题 15:链表中倒数第 k 个结点
|
7月前
|
机器学习/深度学习
【一刷《剑指Offer》】面试题 13:在 O(1) 时间删除链表结点
【一刷《剑指Offer》】面试题 13:在 O(1) 时间删除链表结点
|
7月前
【一刷《剑指Offer》】面试题 5:从尾到头打印链表
【一刷《剑指Offer》】面试题 5:从尾到头打印链表
|
7月前
剑指 Offer 18. 删除链表的节点
剑指 Offer 18. 删除链表的节点
47 0
|
7月前
剑指Offer06.从尾到头打印链表
剑指Offer06.从尾到头打印链表
44 0