将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树。

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

示例:

给定有序数组: [-10,-3,0,5,9],一个可能的答案是:[0,-3,9,-10,null,5],它可以表示下面这个高度平衡二叉搜索树:0/ \-3   9/   /-10  5
思路1: 遍历链表,获得链表长度,找到链表中间的值,形成根结点,根据left,right ,递归寻找结点的左子树和右子树。
因为每次递归都要遍历链表,时间复杂度非常高,
/**
* 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) {if(head==null)return null;ListNode l1=head,l2=head;int count=0;while(l1!=null){l1=l1.next;count++;  //得到链表的长度
        }// for(int i=0;i<count/2;i++){//     l2=l2.next;        //得到链表的中点// }return buildBST(head,0,count-1);}public TreeNode buildBST(ListNode head,int l,int r){if(l>r)return null;int mid=(l+r)/2;ListNode tem=head;for(int i=0;i<mid;i++)tem=tem.next;    //每次递归都要遍历链表TreeNode root=new TreeNode(tem.val);root.left=buildBST(head,l,mid-1);root.right=buildBST(head,mid+1,r);return root;}
}

思路2:先转化为数组,再转化为有序数组转换二叉探索树。

参考:

leetcode- 将有序数组转换为二叉搜索树(java)

class Solution {public TreeNode sortedListToBST(ListNode head) {if(head==null)return null;int count=0;ListNode l1=head;while(l1!=null){l1=l1.next;count++;}int[] nums=new int[count];for(int i=0;i<count;i++){nums[i]=head.val;head=head.next;        //转化为数组
        }return buildBST(nums,0,count-1);        //将排序数组转为二叉探索树
        }public TreeNode buildBST(int[] nums,int l,int r){if(l>r)return null; int mid=(l+r)/2;TreeNode root=new TreeNode(nums[mid]);root.left=buildBST(nums,l,mid-1);root.right=buildBST(nums,mid+1,r);return root;}
}

新的思路:

使用快慢指针解决,慢指针遍历之后处于链表中间位置,slow位置就是根结点,slow->next就是二叉树的右子树,
左边就是左子树。  要将左子树和右子树之间的链表断裂last.next=null  ,fast=slow.next;  左右子树都不包含根结点
class Solution {public TreeNode sortedListToBST(ListNode head) {
//注意若子树只有两个节点,只需以首节点为根构造右子节点为其后节点的子树if(head==null)return null;if(head.next==null)return new TreeNode(head.val);ListNode fast=head,slow=head,last=slow;while(fast.next!=null&&fast.next.next!=null){last=slow;  //这里执行到最后一步的时候,last只比slow慢一个指针。slow=slow.next;fast=fast.next.next;  }TreeNode root=new TreeNode(slow.val);fast=slow.next;//fast部分的链表转化为右子树if(slow!=last){  last.next=null;root.left=sortedListToBST(head);}root.right=sortedListToBST(fast);return root;}
}

转载于:https://www.cnblogs.com/patatoforsyj/p/10062762.html

有序链表转换二叉搜索树(LeetCode)相关推荐

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  8. LeetCode 109. 有序链表转换二叉搜索树(快慢指针+递归)

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

  9. [Leetcode][第109题][JAVA][有序链表转换二叉搜索树][分治][快慢指针][中序遍历]

    [问题描述][中等] [解答思路] 1. 分治 快慢指针 复杂度 class Solution {public TreeNode sortedListToBST(ListNode head) {ret ...

最新文章

  1. 灯泡亮度控制单片机_南航电赛-灯光控制系统
  2. PostgreSQL JDBC SQLWarning
  3. 第一行代码学习笔记第三章——UI开发的点点滴滴
  4. ppp chap 加密摘要_“网络工程师培训”基础教程:一文读懂PPP协议
  5. python网站用什么数据库_PyMySQL数据库的使用
  6. C# 操作IIS服务器Demo
  7. BZOJ_1601_[Usaco2008_Oct]_灌水_(最小生成树_Kruskal)
  8. 分布式技术追踪 2018年第二期
  9. 任天堂连遭数据泄露,《动森》太火爆惊动黑客?
  10. webservice发布及远程调用
  11. AXI仿真之AXI Chip2Chip
  12. 简述 Erasure Code,EC 纠删码原理
  13. 阿里云思维导图系列(一)开篇
  14. lazyLoad-懒加载
  15. robots协议文件的写法及语法属性解释
  16. windows平台上实现websocket服务器
  17. 苹果手机群控 ios免越狱中控 非越狱脚本高清投屏
  18. linux下构建Smokeping网络监控平台
  19. 技术盛典,2016AppCan移动开发者大会即将开启
  20. 微信小程序(二)首页之搜索框

热门文章

  1. tftp刷路由器 linux,TP-Link无线路由器HTTP/TFTP后门漏洞
  2. java加密字符串,可解密
  3. mysql 多主一从备份_(5.14)mysql高可用系列——级联复制与多主一从(多源复制)...
  4. 【mysql】SCOPE_IDENTITY 和 @@IDENTITY的区别
  5. 【Zabbix】yum方式安装zabbix
  6. htc m8 wp android,区别仅系统?WP/Android两版HTC One M8对比
  7. rewrite.php wordpress 缓存 固定连接,【转】Wordpress中文标签无法正常连接 - 完美解决方案...
  8. 孩子有必要学python吗_不学就落后了?孩子都能学得Python编程,究竟是什么?
  9. 机器学习(二)梯度下降
  10. 开源的恶果,程序员正在「自掘坟墓」