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

给定有序链表(元素由小到大), 试问如何将其转换为一个平衡BST?

平衡BST: 任意节点的左右子树的深度差值不大于1.

主要思想是用递归. Trick是使用快慢指针来获取中间节点. 获得中间节点后, 将其设为此次递归的root, 随后删除此节点, 并将前一节点的next置NULL. 随后, 对中间节点的前后部分分别进行递归调用, 并将返回值作为其左右子树.

代码如下:

 1 /**
 2  * Definition for singly-linked list.
 3  * struct ListNode {
 4  *     int val;
 5  *     ListNode *next;
 6  *     ListNode(int x) : val(x), next(NULL) {}
 7  * };
 8  */
 9 /**
10  * Definition for binary tree
11  * struct TreeNode {
12  *     int val;
13  *     TreeNode *left;
14  *     TreeNode *right;
15  *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
16  * };
17  */
18 class Solution {
19 public:
20     TreeNode *sortedListToBST(ListNode *head) {
21         if(head == NULL) return NULL;
22         if(head->next == NULL) return new TreeNode(head->val);
23         ListNode *step1 = head;
24         ListNode *step2 = head->next;
25         while(step2->next != NULL && step2->next->next != NULL){
26             step1 = step1->next;
27             step2 = step2->next->next;
28         }
29         TreeNode *root  = new TreeNode(step1->next->val);
30         ListNode *head2 = step1->next->next;
31         delete step1->next;
32         step1->next = NULL; // cut list into two parts
33         root->left = sortedListToBST(head);
34         root->right = sortedListToBST(head2);
35         return root;
36     }
37 };
时间: 2024-09-30 18:59:26

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

[LeetCode] 109. 有序链表转换二叉搜索树 ☆☆☆(递归)

描述 给定一个单链表,其中的元素按升序排序,将其转换为高度平衡的二叉搜索树. 本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1. 示例: 给定的有序链表: [-10, -3, 0, 5, 9], 一个可能的答案是:[0, -3, 9, -10, null, 5], 它可以表示下面这个高度平衡二叉搜索树: 0 / \ -3 9 / / -10 5 解析 有序链表,平衡二叉树,很自然想到将链表一分为二,两部分就是中间节点的左右节点.递归执行左右2个部分的节点

[LeetCode] 109. 有序链表转换二叉搜索树

题目链接 : https://leetcode-cn.com/problems/convert-sorted-list-to-binary-search-tree/ 题目描述: 给定一个单链表,其中的元素按升序排序,将其转换为高度平衡的二叉搜索树. 本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1. 示例: 给定的有序链表: [-10, -3, 0, 5, 9], 一个可能的答案是:[0, -3, 9, -10, null, 5], 它可以表示下面这个高

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 解题思路 转换二叉搜索树分为以下两步: 首先找到链表中间节点以及它的前一个节点,可以利用快慢指针的思想,接着以

109. Convert Sorted List to Binary Search Tree 将一个有序链表转化成BST

看问题,首先想到的解决办法如下: (1)单独设计一个函数可以,计算出有序链表的中间节点的前驱节点.后续会看到原因,这个函数进入的有序链表长度长度至少有2个节点: (2)回到原来需要设计的函数: a. 如果没有节点返回null,如果是只有一个节点,将这个节点制造成树节点返回:由于这个原因,输入到寻找前驱节点的问题的有序链表至少2个节点: b. 找到前驱节点,找到中间节点,完成赋值. c. 在前驱节点和中间节点之间进行切段:为了实现分治递归的用途: d. 递归寻找左节点,右节点:返回根节点: 其中:

二叉树系列 - 二叉搜索树 - 线性时间内把有序链表转化为BST

引言 本文来自于Google的一道题目: how to merge two binary search tree into balanced binary search tree. how to merge two binary search tree into balanced binary search tree.. Let there be m elements in first tree and n elements in the other tree. Your merge funct

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

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-balanc

LeetCode 109——有序链表转化二叉搜索树

1. 题目 2. 解答 2.1. 方法一 在 LeetCode 108--将有序数组转化为二叉搜索树 中,我们已经实现了将有序数组转化为二叉搜索树.因此,这里,我们可以先遍历一遍链表,将节点的数据存入有序数组中,然后再将有序数组转化为二叉搜索树即可. class Solution { public: TreeNode* sortedListToBST(ListNode* head) { vector<int> nums; while (head != NULL) { nums.push_bac

[LeetCode系列]翻转链表问题II

给定一个链表和两个整数m, n, 翻转链表第m个节点到第n个节点(从1开始计数). 如, 给定链表: 1->2->3->4->5->NULL, 以及 m = 2, n = 4. 返回 1->4->3->2->5->NULL. 假定m和n满足约束条件: 1 ≤ m ≤ n ≤ 链表长度. 注意: 不能使用额外空间, 且只能遍历链表一次. 算法思路: 翻转的过程可以分解成3步: 把相邻的节点的指向关系倒置; 即 1->2<-3<-4

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

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