跟着姚桑学算法-二叉搜索树与双向链表

简介: 剑指offer算法

题. 二叉搜索树与双向链表

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

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

注意:

需要返回双向链表最左侧的节点。
例如,输入下图中左边的二叉搜索树,则输出右边的排序双向链表。

image.png

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

【题解】-- 中序递归遍历

就在中序递归遍历的基础上改了一点点,用一个pre指针保存中序遍历的前一个结点。
因为是中序遍历,遍历顺序就是双线链表的建立顺序;
每一个结点访问时它的左子树肯定被访问过,所以放心改left指针;
同理,pre指向的结点保存的数一定小于当前结点,所以其左右子树肯定都访问过了,故其right指针也可以直接改。

最后需要一直向左找到双向链表的头结点。

复杂度分析:

O(n)级的复杂度;

C++代码实现:

/**
 * 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* pre = NULL;

    TreeNode* convert(TreeNode* root) {
        dfs(root);
        while(root && root->left) root = root->left;
        return root;
    }
    void dfs(TreeNode* root){
        if(!root) return;
        dfs(root->left);

        root->left = pre;
        if(pre) pre->right = root;
        pre = root;

        dfs(root->right);
    }
};
目录
相关文章
|
1月前
|
存储 算法 C#
C#二叉搜索树算法
C#二叉搜索树算法
|
2月前
|
算法
【算法】合并两个有序链表(easy)——递归算法
【算法】合并两个有序链表(easy)——递归算法
【算法】合并两个有序链表(easy)——递归算法
|
2月前
|
算法
【数据结构与算法】共享双向链表
【数据结构与算法】共享双向链表
15 0
|
2月前
|
算法
【数据结构与算法】双向链表
【数据结构与算法】双向链表
16 0
|
2月前
|
算法
【数据结构与算法】循环链表
【数据结构与算法】循环链表
17 0
|
2月前
|
存储 算法
【数据结构与算法】链表
【数据结构与算法】链表
21 0
|
2月前
|
算法
【C算法】链表算法
【C算法】链表算法
|
2月前
|
算法 Java
LeetCode初级算法题:环形链表+排列硬币+合并两个有序数组java解法
LeetCode初级算法题:环形链表+排列硬币+合并两个有序数组java解法
47 0
|
2月前
|
存储 算法 Java
LeetCode初级算法题:反转链表+统计N以内的素数+删除排序数组中的重复项Java详解
LeetCode初级算法题:反转链表+统计N以内的素数+删除排序数组中的重复项Java详解
22 0
|
4月前
|
算法 Java
Java数据结构与算法:双向链表
Java数据结构与算法:双向链表