根据有序链表构造平衡的二叉查找树

leetcode地址:

https://leetcode.com/problems/convert-sorted-list-to-binary-search-tree/description/

难度:中等

描述:

Given a singly linked list where elements are sorted in ascending order, convert it to a height balanced BST.

For this problem, a height-balanced binary tree is defined as a binary tree in which the depth of the two subtrees of every node never differ by more than 1.

Example:

Given the sorted linked list: [-10,-3,0,5,9],

One possible answer is: [0,-3,9,-10,null,5], which represents the following height balanced BST:

      0
     /    -3   9
   /   /
 -10  5

解题思路:

分为两步:

1. 把链表转存到一个数组中,问题转化为:将一个有序数组转化为一个平衡二叉查找树。

2. 取数组的中点为根节点,那么根节点的左子树是由左半边的数组生成的,右子树是由数组右半边生成的,分别对数组左半边和右半边进行递归调用

代码:

public class SortedListToBST {

    public TreeNode sortedListToBST(ListNode head) {        int size = 0;        ListNode p = head;        while (p != null) {            size++;            p = p.next;        }        ListNode[] listNodes = new ListNode[size];        p = head;        int index = 0;        while (p != null) {            listNodes[index++] = p;            p = p.next;        }        return sortedListToBST(listNodes, 0, listNodes.length);    }

    public TreeNode sortedListToBST(ListNode[] listNodes, int start, int end) {        if (start >= end) {            return null;        }        int mid = (end + start) / 2;        TreeNode root = new TreeNode(listNodes[mid].val);        root.left = sortedListToBST(listNodes, start, mid);        root.right = sortedListToBST(listNodes, mid + 1, end);        return root;    }}

原文地址:https://www.cnblogs.com/zhuge134/p/10989336.html

时间: 2024-10-01 03:31:50

根据有序链表构造平衡的二叉查找树的相关文章

[LeetCode系列]有序链表转换为平衡BST的递归解法

给定有序链表(元素由小到大), 试问如何将其转换为一个平衡BST? 平衡BST: 任意节点的左右子树的深度差值不大于1. 主要思想是用递归. Trick是使用快慢指针来获取中间节点. 获得中间节点后, 将其设为此次递归的root, 随后删除此节点, 并将前一节点的next置NULL. 随后, 对中间节点的前后部分分别进行递归调用, 并将返回值作为其左右子树. 代码如下: 1 /** 2 * Definition for singly-linked list. 3 * struct ListNod

链表——有序链表化为平衡二叉查找树

比较直观的解法是自顶向下的递归解决,先找到中间节点作为根节点,然后递归左右两部分.所有我们需要先找到中间节点,题目中要求如果链表结点数为偶,则中间结点为两个中间结点的后一个.对于单链表来说,必须要遍历一边,可以使用快慢指针加快查找速度. 代码如下: </pre>/** * Definition for singly-linked list. * public class ListNode { *     int val; *     ListNode next; *     ListNode(

数据结构:根据有序链表构造平衡二叉树

#include <iostream> #include <stack> using namespace std; struct Node { int data; Node* next; Node(int d = int()):data(d){} }; class List { friend class T; public: List():first(NULL){} void Insert(int a[],int n) { Node *p = NULL; for(int i=0;i

有序链表转换二叉搜索树

问题描述: 给定一个单链表,其中的元素按升序排序,将其转换为高度平衡的二叉搜索树. 本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1. 示例: 给定的有序链表: [-10, -3, 0, 5, 9], 一个可能的答案是:[0, -3, 9, -10, null, 5], 它可以表示下面这个高度平衡二叉搜索树: 0 / -3 9 / / -10 5 解题思路: 将链表先转为数组,之后方法与将有序数组转换为二叉搜索树相同. 实现代码: private sta

LeetCode 109. 有序链表转换二叉搜索树(Convert Sorted List to Binary Search Tree)

题目描述 给定一个单链表,其中的元素按升序排序,将其转换为高度平衡的二叉搜索树. 本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1. 示例: 给定的有序链表: [-10, -3, 0, 5, 9], 一个可能的答案是:[0, -3, 9, -10, null, 5], 它可以表示下面这个高度平衡二叉搜索树: 0 / -3 9 / / -10 5 解题思路 转换二叉搜索树分为以下两步: 首先找到链表中间节点以及它的前一个节点,可以利用快慢指针的思想,接着以

每天一个小算法(2)----合并两个有序链表

每天一个小算法还是有点没时间,尽量抽出时间写一写. 今天是合并有序的链表,对单链表有点忘了,尤其是指针指来指去的,有点晕,幸好基础还算好,想了想还是能想回来. 代码使用随机数函数生成一个链表,然后对链表排序,最后合并链表并打印,删除链表的函数于算法无关紧要,所以未实现^_^. 在Linux/g++下编译运行成功. 合并思路:和合并数组有些类同,比较两个节点的元素大小然后将小的摘下来尾插到链表bList中,然后指针指向下一个节点,最后直接把非空的链表合并到bList的末尾. 1 #include

LeetCode(109):有序链表转换二叉搜索树

Medium! 题目描述: 给定一个单链表,其中的元素按升序排序,将其转换为高度平衡的二叉搜索树. 本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1. 示例: 给定的有序链表: [-10, -3, 0, 5, 9], 一个可能的答案是:[0, -3, 9, -10, null, 5], 它可以表示下面这个高度平衡二叉搜索树: 0 / -3 9 / / -10 5 解题思路: 这道题是要求把有序链表转为二叉搜索树,和之前那道Convert Sorted A

合并N个有序链表与FQ公平调度

下大雨了,于是就想表达一些只有下雨才能表达的东西.夜半酒酣惊觉起,使我流泪忆江南-前天晚上下班带着小小在暴雨中狂奔,非常舒服,其实也算是流言终结者吧.反驳一下几千年来在我国北方通过长辈代代相传的淋雨和感冒之间的因果关系. ??昨天早上很早起来,听雨作文,今天早上继续,文章不算太长. 合并两个有序链表 这是一道超级常见的课后作业题或者面试题,网上答案一搜一箩筐,我自己也写了一个不会编程版: 有序链表合并C语言递归版–我稍微会一点编程:https://blog.csdn.net/dog250/art

c# 有序链表合并 链表反转

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace LinkedListTest { class Program { static void Main(string[] args) { LinkList<int> linkA = new LinkList<int>(); linkA.A