有序链表转换二叉搜索树

问题描述:

给定一个单链表,其中的元素按升序排序,将其转换为高度平衡的二叉搜索树。

本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。

示例:

给定的有序链表: [-10, -3, 0, 5, 9],

一个可能的答案是:[0, -3, 9, -10, null, 5], 它可以表示下面这个高度平衡二叉搜索树:

      0
     / \
   -3   9
   /   /
 -10  5

 

 

解题思路:

将链表先转为数组,之后方法与将有序数组转换为二叉搜索树相同。

 

实现代码:

    private static TreeNode test(int[] nums, int lo, int hi) {

        if (lo < hi) return null;
        if (lo == hi) return new TreeNode(nums[hi]);

        int mid = (lo + hi) / 2;
        TreeNode node = new TreeNode(nums[mid]);
        node.left = test(nums, lo, mid-1);
        node.right = test(nums, mid+1, hi);

        return node;
    }

    public static TreeNode listToBST(ListNode head) {

        // 将链表转为数组
        ListNode temp = head;
        int len = 0;
        while (temp != null) {
            len++;
            temp = temp.next;
            }
        int[] nums = new int[len];
        temp = head;
        len = 0;
        while (temp != null) {
            nums[len++] = temp.val;
            temp = temp.next;
        }
        return test(nums, 0, nums.length);
    }

 

 

 

 

 

 方法2:

直接使用链表生成二叉搜索树。

在递归生成二叉树时,先求左子树,再根节点,最后右子树。

 

实现代码:

    private static TreeNode build(int lo, int hi) {

        if (lo > hi) return null;

        int mid = (lo + hi) / 2;
        // 先求左子树
        TreeNode left = build(lo, mid-1);

        // 构造节点
        TreeNode node = new TreeNode(list.val);
        list = list.next;

        // 右子树
        TreeNode right = build(mid+1, hi);

        node.left = left;
        node.right = right;
        if (mid == (len-1)/2) root = node;
        return node;
    }
    public static TreeNode toBST(ListNode head) {
        // 计算链表总长度
        list = head;
        while (head != null) {
            len++;
            head = head.next;
        }
        build(0, len-1);
        return root;
    }

 

posted on 2018-07-14 19:14  Deltadeblog  阅读(1416)  评论(0编辑  收藏  举报

导航