剑指offer第26题

/**
 * 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。
 * 要求不能创建任何新的结点,只能调整树中结点指针的指向。
 * <p>
 * 思路
 * 方式一
 * 1、先按中序遍历,把节点存入list
 * 2、再把list的节点连接成双向链表
 * <p>
 * 方式二
 * 中序遍历时直接指向
 */
public class Solution26 {
//    public TreeNode Convert(TreeNode pRootOfTree) {
//        if (pRootOfTree == null) {
//            return null;
//        }
//        ArrayList<TreeNode> arrayList = new ArrayList<>();
//        ArrayList<TreeNode> list = inOrder(pRootOfTree, arrayList);
//        return convert(list);
//    }
//
//    private ArrayList<TreeNode> inOrder(TreeNode pRootOfTree, ArrayList<TreeNode> arrayList) {
//        if (pRootOfTree.left != null){
//            inOrder(pRootOfTree.left,arrayList);
//        }
//        arrayList.add(pRootOfTree);
//        if (pRootOfTree.right != null){
//            inOrder(pRootOfTree.right,arrayList);
//        }
//        return arrayList;
//    }
//
//    private TreeNode convert(ArrayList<TreeNode> list) {
//        TreeNode head = new TreeNode(0);
//        TreeNode curr = head;
//        for (int i = 0; i < list.size(); i++) {
//            curr.right = list.get(i).left;
//            list.get(i+1).left = list.get(i).right;
//            curr = curr.right;
//        }
//        return head.right;
//    }

    TreeNode tail;
    TreeNode head;

    public TreeNode Convert(TreeNode pRootOfTree) {
        if (pRootOfTree == null) {
            return pRootOfTree;
        }
        convert(pRootOfTree);
        return head;
    }

    public void convert(TreeNode root) {
        if (root == null) {
            return;
        }
        convert(root.left);
        if (head == null) {
            head = root;
            tail = root;
        } else {
            tail.right = root;
            root.left = tail;
            tail = root;
        }
        convert(root.right);
    }
}
原文地址:https://www.cnblogs.com/Adam-Ye/p/13578970.html