剑指 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的,但是空间复杂度为,所以我们可以考虑如何在原地将链表串好。
其实思路也是中序遍历,但是需要注意到,我们操作一个节点时,还需要之前他的前一个节点,所以用pre来存储前一个节点,并有pre.right = cur
和cur.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);
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!