剑指 Offer 36. 二叉搜索树与双向链表

剑指 Offer 36. 二叉搜索树与双向链表

如果不考虑就地转换的话,可以注意到题目给出的二叉搜索树的条件,将所有的节点按照中序遍历的顺序添加进list中,再从头开始将right指针链好,再从尾部开始将left指针链好,再将头尾链好即可。

/*
// Definition for a Node.
class Node {
    public int val;
    public Node left;
    public Node right;

    public Node() {}

    public Node(int _val) {
        val = _val;
    }

    public Node(int _val,Node _left,Node _right) {
        val = _val;
        left = _left;
        right = _right;
    }
};
*/
class Solution {
    public Node treeToDoublyList(Node root) {
        if(root == null) return root;
        List<Node> list = new ArrayList<>();
        traverse(root, list);
        for(int i = 0; i < list.size() - 1; i++) {
            list.get(i).right = list.get(i + 1);
        }
        for(int i = list.size() - 1; i > 0; i--) {
            list.get(i).left = list.get(i - 1);
        }
        list.get(0).left = list.get(list.size() - 1);
        list.get(list.size() - 1).right = list.get(0);
        return list.get(0);
    }
    private void traverse(Node node, List<Node> list) {
        if(node == null) return ;
        traverse(node.left, list);
        list.add(node);
        traverse(node.right, list);
    }
}

当然这种方式是可以AC的,但是空间复杂度为O(n),所以我们可以考虑如何在原地将链表串好。
其实思路也是中序遍历,但是需要注意到,我们操作一个节点时,还需要之前他的前一个节点,所以用pre来存储前一个节点,并有pre.right = curcur.left = pre这么两个过程来链接链表。
最后还需要把首尾链接起来。

/*
// Definition for a Node.
class Node {
    public int val;
    public Node left;
    public Node right;

    public Node() {}

    public Node(int _val) {
        val = _val;
    }

    public Node(int _val,Node _left,Node _right) {
        val = _val;
        left = _left;
        right = _right;
    }
};
*/
class Solution {
    Node pre, head;
    public Node treeToDoublyList(Node root) {
        if(root == null) return root;
        traverse(root);
        pre.right = head;
        head.left = pre;
        return head;
    }

    private void traverse(Node cur) {
        if(cur == null) {
            return ;
        }
        traverse(cur.left);
        // 第一个节点
        if(pre == null) {
            head = cur;
        } else {
            pre.right = cur;
            cur.left = pre;
        }
        pre = cur;
        traverse(cur.right);
    }
}
posted @   NullPointer_C  阅读(20)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示