2026/3/26 3:11:56
网站建设
项目流程
网站备案后 如何建设,龙岗建设网站,建立的英文怎么读,如何创建网站的快捷方式他会给一个二叉搜索树#xff0c;要求把他改为排好序的双向循环列表#xff0c;并放回最小的值对于二叉搜索树可以知道 对他进行中序遍历可以有序的获取到树中的元素#xff0c;所以可以使用中序遍历来解决排序的问题而如何将他改为双向链表按既然时改为双向链表#xff0c…他会给一个二叉搜索树要求把他改为排好序的双向循环列表并放回最小的值对于二叉搜索树可以知道 对他进行中序遍历可以有序的获取到树中的元素所以可以使用中序遍历来解决排序的问题而如何将他改为双向链表按既然时改为双向链表那么前一个节点必须要知道所以使用一个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 prevprev root这样就维护俩个节点之间的双向连接最后退出递归时head指向的时头 prev指向的时尾需要再维护这俩个节点的连接然他们成为循环 前驱head.leftprev , 后驱prev.rightheadclass 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); } }