1 题目描述
2 算法思路
思路:
- 使用中序遍历遍历每个结点
- 在遍历的途中,构建前驱指针
- 遍历结束后,最后构建头和尾的循环指针即可
算法:
- 特值:当结点为null时,直接返回
- 初始化空结点pre
- 转化为双向链表,递归进行中序遍历
- 终止条件,当cur为空
- 递归左子树dfs(cur.left)
- 构建链表
- 当pre为空时,代表这在访问头节点head
- 当pre不为空时,修改双向结点引用,pre.right = cur; cur.left = pre;
- 保存cur,更新pre = cur,也就是cur 后移一位,变成了后继结点的pre
- 递归右子树dfs(cur.right)
- 构建循环链表,当中序遍历结束后,head指向头节点,pre指向尾节点,因此修改head和pre的引用即可
- 返回head
3 代码
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;
}
public void dfs(Node cur){
if(cur == null)
return;
dfs(cur.left); //向左递归
if(pre != null) //当前节点是头节点
pre.right = cur;
else
head = cur;
cur.left = pre;
pre = cur;
dfs(cur.right); //向右递归
}
}
4 提交结果