题目描述
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。

解答:
1.思路:添加一个数组存放中序遍历的结果。

public class Q_26 {

List<TreeNode> list=new ArrayList<>();
public TreeNode Convert(TreeNode pRootOfTree) {
    if(pRootOfTree==null){
        return null;
    }
    MidSort(pRootOfTree);
    return mangeList();
}
public void MidSort(TreeNode pRootOfTree) {
    if (pRootOfTree == null) {
        return;
    }
    MidSort(pRootOfTree.left);
    list.add(pRootOfTree);
    MidSort(pRootOfTree.right);
}
public TreeNode mangeList() {
    TreeNode pre = list.get(0);
    TreeNode tmp;
    for (int i = 1; i < list.size(); i++) {
        tmp = list.get(i);
        tmp.left = pre;
        pre.right = tmp;
        pre = tmp;
    }
    return list.get(0);
}

}

2.这个方法不需要创建数组
public class Q_26 {

/**
 * 参照:https://blog.nowcoder.net/n/7ada22418aba4e01be27ef38d557a41c?f=comment
 * 思路:设立一个从尾部遍历到头部的pre节点,在每次递归的时候,把当前节点和pre节点的顺序设置好,然后把pre节点向前移动一个
 */
TreeNode pre = null;
List<TreeNode> list = new ArrayList<>();

public TreeNode Convert(TreeNode pRootOfTree) {
    if (pRootOfTree == null) {
        return null;
    }
    Convert(pRootOfTree.right);
    if (pre == null) {
        pre = pRootOfTree;
    } else {
        pre.left = pRootOfTree;
        pRootOfTree.right = pre;
        pre = pRootOfTree;
    }
    Convert(pRootOfTree.left);
    return pre;
}

}