输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
思路分析:
采用递归的思想,先找到左子树的右节点,该节点与根节点形成双向链表;然后,找到右子树的最左节点,根节点与该节点形成双向链表。
/**
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
*/
public class Solution {
public TreeNode Convert(TreeNode pRootOfTree) {
if(pRootOfTree==null)
return null;
if(pRootOfTree.left==null&&pRootOfTree.right==null)
return pRootOfTree;
//1.将左子树构造成双链表,并返回链表头节点
TreeNode left=Convert(pRootOfTree.left);
TreeNode p=left;
//2.定位至左子树双链表最后一个节点
while(p!=null&&p.right!=null)
{
p=p.right;
}
//3.如果左子树链表不为空,将当前pRootOfTree追加到左子树链表
if(left!=null)
{
p.right=pRootOfTree;
pRootOfTree.left=p;
}
//4.将右子树构造成双链表,并返回链表头结点
TreeNode right=Convert(pRootOfTree.right);
//5.如果右子树链表不为空,将该链表追加到pRootOfTree节点之后
if(right!=null)
{
pRootOfTree.right=right;
right.left=pRootOfTree;
}
return left!=null?left:pRootOfTree;
}
}