--- 将二叉搜索树转化为排序的双向链表 ---
2026/5/28 2:42:47 网站建设 项目流程

他会给一个二叉搜索树,要求把他改为排好序的双向循环列表,并放回最小的值

对于二叉搜索树可以知道 对他进行中序遍历可以有序的获取到树中的元素,所以可以使用中序遍历来解决排序的问题

而如何将他改为双向链表按

既然时改为双向链表,那么前一个节点必须要知道,所以使用一个prev指针来维护和当前节点的前后指向关系,而我又要放回头节点,所以还需要一个head来记录头节点

对于这棵树 前序遍历一直到 1 节点,会触发修改节点指向的逻辑

这时head 为空 prev 为空,该节点也为最小的节点 所以head == 1节点, 而prev呢

他代表的时1 前面的节点,应该让1 节点的前驱 left 指向prev 然后prev 走到 1 节点,而prev为啥不维护后驱 prev.right呢 为空的嘛

继续回溯

当root 为2 节点

有prev不为空,这时就需要维护后驱了,prev.right = 2节点, 维护前驱 root.right= prev,

prev = root

这样就维护俩个节点之间的双向连接

最后退出递归时

head指向的时头 prev指向的时尾

需要再维护这俩个节点的连接然他们成为循环 前驱head.left=prev , 后驱prev.right=head

class Solution { Node pre, head; public Node treeToDoublyList(Node root) { if(root == null) return null; dfs(root); head.left = pre; pre.right = head; return head; } void dfs(Node root){ if(root == null) return; dfs(root.left); if(pre == null){ head = root; }else{ //后继 pre.right = root; } //前驱 root.left = pre; pre = root; dfs(root.right); } }

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询