426. 将二叉搜索树转化为排序的双向链表

426. 将二叉搜索树转化为排序的双向链表

将一个 二叉搜索树 就地转化为一个 已排序的双向循环链表

对于双向循环列表,你可以将左右孩子指针作为双向循环链表的前驱和后继指针,第一个节点的前驱是最后一个节点,最后一个节点的后继是第一个节点。

特别地,我们希望可以 原地 完成转换操作。当转化完成以后,树中节点的左指针需要指向前驱,树中节点的右指针需要指向后继。还需要返回链表中最小元素的指针。

示例 1:

在这里插入图片描述

输入:root = [4,2,5,1,3] 

输出:[1,2,3,4,5]

解释:下图显示了转化后的二叉搜索树,实线表示后继关系,虚线表示前驱关系。

在这里插入图片描述

示例 2:

输入:root = [2,1,3]
输出:[1,2,3]

提示:

  • 树中节点的数量在范围 [0, 2000]
  • -1000 <= Node.val <= 1000
  • 树中的所有值都是 独一无二

DFS中序遍历

  1. 在中序遍历中构建双向链表。
  2. 中序遍历完要把双向链表的首尾节点连起来形成循环双向链表。
class Solution {
    private Node first = null;
    private Node last = null;

    public Node treeToDoublyList(Node root) {
        if (root == null) return null;

        // 中序遍历树并构建链表
        inOrder(root);

        // 连接头尾节点形成循环链表
        first.left = last;
        last.right = first;

        return first;
    }

    private void inOrder(Node node) {
        if (node == null) return;

        // 遍历左子树
        inOrder(node.left);

        // 处理当前节点
        if (last != null) {
            // 更新最后一个节点的右指针
            last.right = node;
            // 更新当前节点的左指针
            node.left = last;
        } else {
            // 记录第一个节点,这个操作只会在处理第一个节点时执行。last永远前进,first确定后就不前进了。
            first = node;
        }
        // 更新最后一个节点
        last = node;

        // 遍历右子树
        inOrder(node.right);
    }
}

时间复杂度O(n),空间复杂度O(h),h是树的高度,最大是n。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值