题目描述
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
/*
解题思路:类似于递归的中序遍历
1.将左子树构造成双链表,并返回链表头节点。
2.定位至左子树双链表最后一个节点。
3.如果左子树链表不为空的话,将当前pRootOfTree追加到左子树链表。
4.将右子树构造成双链表,并返回链表头节点。
5.如果右子树链表不为空的话,将该链表追加到pRootOfTree节点之后。
6.根据左子树链表是否为空确定返回的节点。
*/
public class Solution {
public TreeNode Convert(TreeNode pRootOfTree) {
if(pRootOfTree==null)
return null;
if(pRootOfTree.left==null&&pRootOfTree.right==null)
return pRootOfTree;
// 1.将左子树构造成双链表,并返回链表头节点left
TreeNode left = Convert(pRootOfTree.left);//备份left点
TreeNode p = left;//返回的p是左子树链表的头节点,也就是left最终指向的节点
// 2.定位至左子树双链表最后一个节点,也就是一直取最右
while(p!=null&&p.right!=null){
p = p.right;
}
// 3.如果左子树链表不为空的话,建立根节点root与左子树最右结点p的双向连接
//将当前root追加到p的右边,root左节点指向P
if(left!=null){
p.right = pRootOfTree;
pRootOfTree.left = p;
}
// 4.将右子树构造成双链表,并返回链表头节点
TreeNode right = Convert(pRootOfTree.right);
// 5.如果右子树链表不为空的话,将该链表追加到pRootOfTree节点之后
if(right!=null){
right.left = pRootOfTree;
pRootOfTree.right = right;
}
return left!=null?left:pRootOfTree;//返回的是头节点,是left最终指向的那个点
//左子树链表不为空则返回left,否则为空的话,头节点就是root。
}
}