输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
public class Solution {
//记录左子树的最右一个节点 有时候也指的是当前双链表的最后一个节点
protected TreeNode lastLeft = null;
public TreeNode Convert(TreeNode pRootOfTree) {
if(pRootOfTree == null) return null;
if(pRootOfTree.left==null && pRootOfTree.right==null){
lastLeft = pRootOfTree;//最右侧的叶子节点
return pRootOfTree;
}
//将左子树构成双向链表(lastLeft会被更新),并返回
TreeNode leftList = Convert(pRootOfTree.left);
//将根节点追加到左子树构成的双向链表之后
if(leftList != null){
lastLeft.right = pRootOfTree;
pRootOfTree.left = lastLeft;
}
//当该树只有左子树,最后一个节点是根节点
lastLeft = pRootOfTree;
//将右子树构成双向链表,在convert中lastLeft被更新成了右边链表的最后一个节点
TreeNode rightList = Convert(pRootOfTree.right);
//将左边和右边连接起来
if(rightList != null){
rightList.left = pRootOfTree;//这里不是lastLeft,因为在最近一个convert()调用中已被更新
pRootOfTree.right = rightList;
}
return leftList==null?pRootOfTree:leftList;
}

京公网安备 11010502036488号