思路
- 以中序遍历遍历一棵二叉树的时候,每遍历到一个结点,修改该结点的left指针指向前一个遍历到的结点,修改前一个遍历结点的right指针,指向当前结点。
- 每次递归调用的时候,更新当前遍历结点的right指针让其指向头结点head,同时更新头结点head的left指针让其指向当前遍历结点。
代码
void treeToDoubleList(Node p,Node prev,Node head){
if(p == null) return;
treeToDoubleList(p.left,prev,head);
p.left = prev;
if(prev != null) prev.right = p;
else head = p;
head.left = p;
p.right = head;
prev = p;
treeToDoubleList(p.right,prev,head);
}
Node treeToDoubleList(Node root){
Node prev = null;
Node head = null;
treeToDoubleList(root,prev,head);
return head;
}