Loading

通过有序数组生成平衡搜索二叉树 & 有序链表转换二叉搜索树(力扣)

通过有序数组生成平衡搜索二叉树

题目:将有序数组转换为二叉搜索树

《程序员代码面试指南》第47题 P152 难度:士★☆☆☆

通过数组生成很简单,只需要用有序数组最中间的数生成搜索二叉树的头节点,然后其左边右边的数分别作为头节点的左子树右子树即可,然后再往下递归,最终生成整棵二叉树。

public Node generateTree(int[] sortArr) {
    if (sortArr == null) {
        return null;
    }
    return generate(sortArr, 0, sortArr.length - 1);
}

public Node generate(int[] sortArr, int start, int end) {
    if (start > end) {
        return null;
    }
    int mid = (start + end) / 2;
    Node head = new Node(sortArr[mid]);
    head.left = generate(sortArr, start, mid - 1);
    head.right = generate(sortArr, mid + 1, end);
    return head;
}

有序链表转换二叉搜索树

题目:有序链表转换二叉搜索树

力扣第109题 难度:中等

和上题一样,同样是用中间节点作为二叉树的根节点,左右边作为其左右子树。不过链表不好直接用索引很方便的访问,而且单向链表也不好向前遍历。因此思路不完全一样。

官方题解有序链表转换二叉搜索树——题解

两种方法都是分治法(虽然没学过,不过大概是那个意思)。

方法一通过快慢指针来定位中间节点,时间复杂度O(nlogn),空间复杂度:

class Solution {
    public TreeNode sortedListToBST(ListNode head) {
        return buildTree(head, null);
    }

    public TreeNode buildTree(ListNode left, ListNode right) {
        if (left == right) {
            return null;
        }
        ListNode mid = getMedian(left, right);
        TreeNode root = new TreeNode(mid.val);
        root.left = buildTree(left, mid);
        root.right = buildTree(mid.next, right);
        return root;
    }

    public ListNode getMedian(ListNode left, ListNode right) {
        ListNode fast = left;
        ListNode slow = left;
        while (fast != right && fast.next != right) {
            fast = fast.next;
            fast = fast.next;
            slow = slow.next;
        }
        return slow;
    }
}

作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/convert-sorted-list-to-binary-search-tree/solution/you-xu-lian-biao-zhuan-huan-er-cha-sou-suo-shu-1-3/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

方法二分治+中序遍历优化,将这两者结合起来,时间复杂度O(n),空间复杂度:

class Solution {
    ListNode globalHead;

    public TreeNode sortedListToBST(ListNode head) {
        globalHead = head;
        int length = getLength(head);
        return buildTree(0, length - 1);
    }

    public int getLength(ListNode head) {
        int ret = 0;
        while (head != null) {
            ++ret;
            head = head.next;
        }
        return ret;
    }

    public TreeNode buildTree(int left, int right) {
        if (left > right) {
            return null;
        }
        int mid = (left + right + 1) / 2;
        TreeNode root = new TreeNode();
        root.left = buildTree(left, mid - 1);
        root.val = globalHead.val;
        globalHead = globalHead.next;
        root.right = buildTree(mid + 1, right);
        return root;
    }
}

作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/convert-sorted-list-to-binary-search-tree/solution/you-xu-lian-biao-zhuan-huan-er-cha-sou-suo-shu-1-3/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

posted @ 2022-02-18 20:31  幻梦翱翔  阅读(58)  评论(0)    收藏  举报