题目描述:输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。 要求不能创建任何新的结点,只能调整树中结点指针的指向。
思路:定义一个链表的尾节点,递归处理左右子树,最后返回链表的头节点
//中序遍历即为从小到大排序
/*中序遍历:把一棵二叉排序树看成三个部分,根节点,右子树,左子树,
根节点的左指针指向左子树的形成链表的最后一个节点,
根节点的右孩子指向右子树形成链表的第一个节点,
再对左右递归进行上述操作。*/
package Function;
import Test.TreeNode;
public class Convert36 {
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;
}
}