有序链表转换二叉搜索树
问题描述:
给定一个单链表,其中的元素按升序排序,将其转换为高度平衡的二叉搜索树。
本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 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) 编辑 收藏 举报