将二叉树转换成排序的双向循环链表,其中包含三个条件:1,排序;2,双向链表;3,循环链表;
条件1:将一个树排序很简单,采用“左-->根-->右”的中序遍历方式。
条件2:引入一个前驱节点pre,它随着遍历也在不停的往后移,所以,当遍历到当前节点时,把当前节点的左指针指向pre,把pre的右指针指向当前节点。
条件3:把头节点的左指针指向尾节点,把尾节点的右指针指向头节点。
中序遍历
// 打印中序遍历
void dfs(Node root) {
if(root == null) return;
dfs(root.left); // 左
System.out.println(root.val); // 根
dfs(root.right); // 右
}
将中序遍历dfs()中的print改成这道题的操作即可。
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;
}
private 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);
}
}
如果当前节点是空,直接赋给head记录下来,不是空的话,pre就可以指向当前节点,但无论是不是空当前节点的左指针一定要指向pre,pre再往下移一步移到当前节点,再dfs在一个节点。因为递归完成之后,pre是指向最后一个节点的,所以最后pre就是尾节点,最后head和pre互相指就可以。