把二叉搜索树换成排序的双向链表
1 什么是二叉搜索树
2 怎么把它变成双向链表
// 返回值的含义表示链表的头节点.
public TreeNode Convert(TreeNode root) {
if (root == null) {
return null;
}
if (root.left == null && root.right == null) {
// 只有一个根节点. 得到的链表也就只有一个节点
return root;
}
// 先递归处理左子树, 这个方法一执行, 就相当于把左子树已经完整的转换成双向链表了
// left 就是左子树链表的头结点.
TreeNode left = Convert(root.left);
// 处理根节点, 需要把根节点追加到左子树链表的末尾.
// 这就相当于链表尾插, 需要先找到前面链表的最后一个节点.
TreeNode leftTail = left;
while (leftTail != null && leftTail.right != null) {
leftTail = leftTail.right;
}
// 当上述循环结束之后, leftTail 就是 left 这个链表的最后一个节点.
// 把当前根节点, 尾插过去
// 当 left 为 null (没有左子树的时候), leftTail 也就是 null
if (leftTail != null) {
leftTail.right = root;
root.left = leftTail;
}
// 最后递归处理右子树, right 就是右子树链表的头结点
TreeNode right = Convert(root.right);
if (right != null) {
// 根节点和右子树连接到一起
right.left = root;
root.right = right;
}
// 返回整个链表的头结点
return left != null ? left : root;
}