有序链表转换二叉平衡搜索树
- leetcode109. 有序链表转换二叉搜索树
- 题目描述
- 解题思路
- 代码演示
- 链表和二叉树专题
leetcode109. 有序链表转换二叉搜索树
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/convert-sorted-list-to-binary-search-tree
题目描述
给定一个单链表的头节点 head ,其中的元素 按升序排序 ,将其转换为高度平衡的二叉搜索树。
本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差不超过 1。
示例 1:
输入: head = [-10,-3,0,5,9]
输出: [0,-3,9,-10,null,5]
解释: 一个可能的答案是[0,-3,9,-10,null,5],它表示所示的高度平衡的二叉搜索树。
示例 2:
输入: head = []
输出: []
提示:
head 中的节点数在[0, 2 * 104] 范围内
-105 <= Node.val <= 105
解题思路
用递归解题:
要构造出平衡的搜索二叉树,就要找到链表的中点,
中点是头节点,左边构造左树,右边构造右树,
代码演示
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public TreeNode sortedListToBST(ListNode head) {
if(head == null){
return null;
}
return buildTree(head, null);
}
/**
* 递归
*
*/
public TreeNode buildTree(ListNode left,ListNode right){
//base case
if(left == right){
return null;
}
ListNode mid = getMid(left,right);
TreeNode root = new TreeNode(mid.val);
root.left = buildTree(left,mid);
root.right = buildTree(mid.next,right);
return root;
}
/**
* 获取链表中点.
*/
public ListNode getMid(ListNode left,ListNode right){
ListNode slow = left;
ListNode fast = left;
while(fast != right && fast.next != right ){
slow = slow.next;
fast = fast.next.next;
}
return slow;
}
}
链表和二叉树专题
leetcode61. 旋转链表
leetcode24. 两两交换链表中的节点
leetcode652. 寻找重复的子树
leetcode450. 删除二叉搜索树中的节点
leetcode701. 二叉搜索树中的插入操作
leetcode98. 验证二叉搜索树