目录

LeetCode-109.-有序链表转换二叉搜索树

目录

LeetCode 109. 有序链表转换二叉搜索树

https://i-blog.csdnimg.cn/blog_migrate/fcdf2a3d124b4498d771ade837415889.png

https://i-blog.csdnimg.cn/blog_migrate/ab6e2b378cf516396ee4d8cccf8eaef2.png

【存节点值】还是用老方法把节点的值都存下来然后递归构造

class Solution {

    List<Integer> list = new ArrayList();

    TreeNode dfs(int left, int right){
        if(left > right) return null;
        if(left == right) return new TreeNode(list.get(left));
        int mid = (left + right) >>> 1;
        return new TreeNode(list.get(mid), dfs(left, mid - 1), dfs(mid + 1, right));
    }

    public TreeNode sortedListToBST(ListNode head) {
        while(head != null){
            list.add(head.val);
            head = head.next;
        }
        return dfs(0, list.size() - 1);
    }
}

插句题外话,这样其实相当于后序遍历进行构造了,因为我们发现其实是先构造左侧后构造右侧,最后再构造根,再返回。但是很明显有序链表相当于BST的中序遍历,所以直接中序遍历就可以不用去get特定位置的值了。

【根据中序遍历】

具体方法还是需要先求出list的长度来,这个长度是用来决定二叉树dfs的深度的。

class Solution {

    ListNode node;

    public TreeNode dfs(int left, int right){
        if(left > right) return null;
        int mid = (left + right) >>> 1;
        TreeNode l = dfs(left, mid - 1);
        TreeNode root = new TreeNode();
        root.val = node.val;
        node = node.next;
        root.left = l;
        TreeNode r = dfs(mid + 1, right);
        root.right = r;
        return root;
    }

    public TreeNode sortedListToBST(ListNode head) {
        node = head;
        int n = 0;
        while(head != null){
            n++;
            head = head.next;
        }
        return dfs(0, n - 1);
    }
}