有序链表转换二叉搜索树
Posted deltadeblog
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了有序链表转换二叉搜索树相关的知识,希望对你有一定的参考价值。
问题描述:
给定一个单链表,其中的元素按升序排序,将其转换为高度平衡的二叉搜索树。
本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 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; }
以上是关于有序链表转换二叉搜索树的主要内容,如果未能解决你的问题,请参考以下文章
⭐算法入门⭐《二叉树 - 二叉搜索树》简单11 —— LeetCode 109. 有序链表转换二叉搜索树