题目
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
分析
首先,二叉搜索树的中序遍历结果即是有序的,因此此题要套中序遍历的模板。
其次,左子树的双向链表的最后一个节点应指向根节点,根节点应指向右子树的双向链表的第一个节点。
最后,递归的退出条件是节点为null或者节点是叶子节点
代码
public class Solution {
public TreeNode Convert(TreeNode pRootOfTree) {
//套中序遍历递归的模板,递归的话首先要写好递归的出口
if(pRootOfTree == null){ //空节点
return null;
}
if(pRootOfTree.left==null && pRootOfTree.right==null){ //叶子节点
return pRootOfTree;
}
TreeNode left = Convert(pRootOfTree.left); //先将左子树转化为双向链表,并返回头结点
TreeNode p = left;
while(p!=null && p.right!=null){
p = p.right; //找到左子树的最后一个节点
}
if(p!=null){
p.right = pRootOfTree; //p的下一个节点是根节点
pRootOfTree.left = p; //根节点的上一个节点是p
}
TreeNode right = Convert(pRootOfTree.right); //将右子树转化为双向链表,并返回头结点
if(right!=null){
pRootOfTree.right = right; //根节点的下一个节点是右子树的第一个节点
right.left = pRootOfTree;
}
return left!=null? left:pRootOfTree;
}
}