搜索二叉树转换有序双向链表

592 阅读2分钟

「这是我参与2022首次更文挑战的第16天,活动详情查看:2022首次更文挑战」。

给定一棵搜索二叉树头节点,转化成首尾相接的有序双向链表

LeetCode

一、分析

前置知识:二叉树、搜索二叉树、双向链表

二叉树结构:value、left、right

搜索二叉树结构:value、left、right,任何头节点比左边节点大,比右边节点小

双向链表结构:next、pre(last)指针

搜索二叉树:任何头节点,它的左节点比它小,它的右节点比它大

二叉树:L、R 指针

双向链表:next、last(pre)指针

任何头节点,它的左子树形成有序双向链表,它的右子树形成有序双向链表,头节点在中间,整体形成有序双向链表,然后头尾再分别指向,最终就是搜索二叉树转换有序双向链表

x为头的整颗二叉树变成有序链表,返回Info信息有两个,转完之后的头指针(start)、转完之后的尾指针(end),Info信息的尾部的右指针指向Info的头指针,Info信息的头部的左指针指向Info的尾指针,即 allInfo.end.right = allInfo.start,allInfo.start.left = allInfo.end

二、实现

public static class Node {
    public int value;
    public Node left;
    public Node right;

    public Node(int data) {
        this.value = data;
    }
}

public static Node treeToDoublyList(Node head) {
    if (head == null) {
        return null;
    }
    Info allInfo = process(head);
    allInfo.end.right = allInfo.start;
    allInfo.start.left = allInfo.end;
    return allInfo.start;
}

public static class Info {
    public Node start;
    public Node end;

    public Info(Node start, Node end) {
        this.start = start;
        this.end = end;
    }
}

public static Info process(Node X) {
    if (X == null) {
        return new Info(null, null);
    }
    Info lInfo = process(X.left);
    Info rInfo = process(X.right);
    if (lInfo.end != null) {
        lInfo.end.right = X;
    }
    X.left = lInfo.end;
    X.right = rInfo.start;
    if (rInfo.start != null) {
        rInfo.start.left = X;
    }
    // 整体链表的头    lInfo.start != null ? lInfo.start : X
    // 整体链表的尾    rInfo.end != null ? rInfo.end : X
    return new Info(lInfo.start != null ? lInfo.start : X, rInfo.end != null ? rInfo.end : X);
}

三、总结

二叉树递归套路

整体链表的头 lInfo.start != null ? lInfo.start : X

整体链表的尾 rInfo.end != null ? rInfo.end : X