https://leetcode-cn.com/problems/er-cha-sou-suo-shu-yu-shuang-xiang-lian-biao-lcof/
思路
中序遍历(左,根,右)二叉搜索树就是有序的。本题要求第一个结点的前驱指向最后一个结点,最后一个结点的后继指向第一个节点。需要考虑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 null;
dfs(root);
head.left=pre;//头结点的前驱是尾结点
pre.right=head;//尾结点的后继是头结点
return head;
}
public void dfs(Node root){
if(root==null){
return;
}
dfs(root.left);
//当前结点不是头结点
if(pre!=null){
pre.right=root;//上一个结点的后继结点设为当前结点
}
else{
head=root;//将当前节点设为头结点
}
root.left=pre;//当前结点的前驱结点
pre=root;//将当前结点设为最后一个结点,即下一个结点的pre
dfs(root.right);
return;
}
}
复杂度
时间复杂度 O(N) : N为二叉树的节点数,中序遍历需要访问所有节点。
空间复杂度 O(N): 最差情况下,即树退化为链表时,递归深度达到 N,系统使用O(N) 栈空间。