双向链表从左到右的顺序很明显就是中序遍历二叉树输出的顺序,因此核心思想就是使用中序遍历,在遍历过程中调整指针的指向。需要用到两个全局变量(递归的题目不用吝啬全局变量), c u r N o d e curNode curNode存储上一次访问的节点, h e a d head head用来保存头节点。遍历过程中只需要用到 c u r N o d e curNode curNode。
直接套用中序遍历的模板,当curNode==null
时,表明是第一个节点,此时将头节点head
指向第一个节点,且将第一个节点的左指针设为null,因为它没有前驱;如果不是第一个节点,则将上一个节点curNode
的右指针指向当前节点,当前节点的左指针指向上一个节点,并更新curNode
。
public class Solution {
public TreeNode curNode = null;
public TreeNode head = null;
public TreeNode Convert(TreeNode pRootOfTree) {
if (pRootOfTree == null)
return null;
Convert(pRootOfTree.left);
if (curNode == null) {
// 第一个节点
head = pRootOfTree;
curNode.left = null;
} else {
curNode.right = pRootOfTree; // 上一个节点右指针指向当前节点
pRootOfTree.left = curNode; // 当前节点的左指针指向上一个节点
}
curNode = pRootOfTree; // 移动到当前节点
Convert(pRootOfTree.right);
return head;
}
}