题目描述
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。
要求不能创建任何新的结点,只能调整树中结点指针的指向。
解法一 JAVA 代码
class Solution {
public TreeNode convert(TreeNode root) {
if(root==null)
return null;
if(root.left==null&&root.right==null)
return root;
// 1.将左子树构造成双链表,并返回链表头节点
TreeNode left = convert(root.left);
TreeNode p = left;
// 2.定位至左子树双链表最后一个节点
while(p!=null&&p.right!=null){
p = p.right;
}
// 3.如果左子树链表不为空的话,将当前root追加到左子树链表
if(left!=null){
p.right = root;
root.left = p;
}
// 4.将右子树构造成双链表,并返回链表头节点
TreeNode right = convert(root.right);
// 5.如果右子树链表不为空的话,将该链表追加到root节点之后
if(right!=null){
right.left = root;
root.right = right;
}
return left!=null?left:root;
}
}
解法二
class Solution {
public TreeNode convert(TreeNode root) {
if (root == null){
return null;
}
TreeNode head = convert0(root);
while(head.left != null){
head = head.left;
}
return head;
}
private TreeNode convert0(TreeNode root){
if (root == null){
return null;
}
// 对于左子树来说需要连接到左子树最右边节点
if (root.left != null){
TreeNode left = convert0(root.left);
while (left.right != null){
left = left.right;
}
root.left = left;
left.right = root;
}
// 对于右子树来说需要连接到右子树最左边节点
if (root.right != null){
TreeNode right = convert0(root.right);
while (right.left != null){
right = right.left;
}
right.left = root;
root.right = right;
}
return root;
}
}