给定一个单链表,其中的元素按升序排序,将其转换为高度平衡的二叉搜索树。

本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。

解题思路

先将链表转换成数组,再构造二叉搜索树

代码

/*** Definition for singly-linked list.* public class ListNode {*     int val;*     ListNode next;*     ListNode(int x) { val = x; }* }*/
/*** Definition for a binary tree node.* public class TreeNode {*     int val;*     TreeNode left;*     TreeNode right;*     TreeNode(int x) { val = x; }* }*/
class Solution {public TreeNode sortedListToBST(ListNode head) {ArrayList<Integer> list=new ArrayList<>();while (head!=null){list.add(head.val);head= head.next;}int[] k=new int[list.size()];for(int c=0;c<k.length;c++)k[c]=list.get(c);return sortedArrayToBST(k);}public TreeNode sortedArrayToBST(int[] nums) {if(nums.length==0) return null;return BST(nums,0,nums.length-1);}public TreeNode BST(int[] nums,int left,int right) {if(left>right) return null;if(left==right) return new TreeNode(nums[left]);int mid=left+((right-left)>>1);TreeNode treeNode=new TreeNode(nums[mid]);treeNode.right=BST(nums,mid+1,right);treeNode.left=BST(nums,left,mid-1);return treeNode;}
}

解题思路

通过快慢指针找链表的中点,进行递归

代码


class Solution {public TreeNode sortedListToBST(ListNode head) {if(head==null) return null;return helper(head,null);}public TreeNode helper(ListNode head,ListNode tail) {if(head==tail) return null;ListNode slow=head,fast=head;while (fast!=tail&&fast.next!=tail){fast=fast.next.next;slow=slow.next;}TreeNode treeNode=new TreeNode(slow.val);treeNode.right=helper(slow.next,tail);treeNode.left=helper(head,slow);return treeNode;}
}

leetcode109. 有序链表转换二叉搜索树(深度优先搜索/快慢指针)相关推荐

  1. leetcode109. 有序链表转换二叉搜索树

    给定一个单链表,其中的元素按升序排序,将其转换为高度平衡的二叉搜索树. 本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1. 示例: 给定的有序链表: [-10 ...

  2. leetcode109. 有序链表转换二叉搜索树(递归)

    给定一个单链表,其中的元素按升序排序,将其转换为高度平衡的二叉搜索树.本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1.示例:给定的有序链表: [-10, - ...

  3. 有序链表转换二叉搜索树

    109. 有序链表转换二叉搜索树 给定一个单链表,其中的元素按升序排序,将其转换为高度平衡的二叉搜索树. 本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1. ...

  4. 109. 有序链表转换二叉搜索树

    链接:109. 有序链表转换二叉搜索树 题解:https://leetcode-cn.com/problems/convert-sorted-list-to-binary-search-tree/so ...

  5. ( “树” 之 BST) 109. 有序链表转换二叉搜索树 ——【Leetcode每日一题】

    二叉查找树(BST):根节点大于等于左子树所有节点,小于等于右子树所有节点. 二叉查找树中序遍历有序. 109. 有序链表转换二叉搜索树 给定一个单链表的头节点 head ,其中的元素 按升序排序 , ...

  6. 【LeetCode每日一题】——109.有序链表转换二叉搜索树

    文章目录 一[题目类别] 二[题目难度] 三[题目编号] 四[题目描述] 五[题目示例] 六[题目提示] 七[解题思路] 八[时间频度] 九[代码实现] 十[提交结果] 一[题目类别] 二叉树 二[题 ...

  7. Java实现 LeetCode 109 有序链表转换二叉搜索树

    109. 有序链表转换二叉搜索树 给定一个单链表,其中的元素按升序排序,将其转换为高度平衡的二叉搜索树. 本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1. ...

  8. 【算法】有序链表转换二叉搜索树和从中序与后序遍历序列构造二叉树Java解答参考

    三道算法题 1.有序链表转换二叉搜索树 Java代码参考 2.从中序与后序遍历序列构造二叉树 Java代码参考 3.移除元素 Java代码参考 1.有序链表转换二叉搜索树 给定一个单链表,其中的元素按 ...

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

    Medium! 题目描述: 给定一个单链表,其中的元素按升序排序,将其转换为高度平衡的二叉搜索树. 本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1. 示例: ...

最新文章

  1. 格式工厂mac版_格式工厂无广告版,支持PDF文件的转换
  2. 提高C++代码质量 - [083]不要返回局部变量的引用
  3. classpath和读取resources目录下的文件
  4. Lua 文件 I/O
  5. Ubuntu开机自动启动script(2)
  6. python stdout清空_python中stdout输出不缓存的设置方法
  7. idea远程调试Java应用程序
  8. 百度语音识别最新资讯
  9. 深入Linux网络核心堆栈--netfilter详解(整理)
  10. matlab如何持续存贮多维矩阵,matlab多维矩阵在内存中存储顺序
  11. excel二维表转化为一维表
  12. 班长快速统计到班上同学信息(excel表格)
  13. 罗振宇2018《时间的朋友》--小趋势
  14. CSS盒子塌陷及解决方法
  15. Pyecharts - 数据可视化
  16. 华为SDH传输设备时钟配置方法
  17. 使用C++实现双链表
  18. Python FAQ:Web开发
  19. i5 10210u和1035G1 的区别 哪个好
  20. 详解atoi/itoa函数

热门文章

  1. iptables:tproxy做透明代理
  2. strtol,strtoll,strtoul, strtoull函数的使用
  3. 函数dup和dup2
  4. WinPcap笔记(3):获取已安装设备的详细信息
  5. 阿里P8面试官都说太详细了,面试资料分享
  6. 学生档案c语言编程,学生档案管理问题
  7. redius和oracle怎么配置,求个 交换机radius 详细配置案例
  8. HDOJ 2037:今年暑假不AC_大二写
  9. 《精通Spring4.X企业应用开发实战》读后感第二章
  10. 在Centos中安装mysql