LeetCode OJ 109. Convert Sorted List to Binary Search Tree
2016-04-21 10:00
344 查看
Given a singly linked list where elements are sorted in ascending order, convert it to a height balanced BST.
涉及到二叉树的问题用递归的方法很容易理解。这个问题要求把一个升序排序的链表转换为一颗height balanced BST。转换的方式就是把链表的中间值作为树的根节点,中间值的左半部分转换为二叉树的左子树,中间值的右半部分转换为二叉树的右子树。
递归解决问题的步骤如下:
1. 如果链表的长度为0,返回null;
2. 如果链表长度为1,创建新的二叉树节点node,node.left=null,node.right=null,node.val=head.val。
3. 否则的话找到链表的中间节点,即第mid = length%2==0?length/2:length/2+1个节点为根节点node。此时链表被分成两个部分,前半部分的长度为mid-1,后半部分的长度为length-mid,递归求这两部分的结果,并把他们分别赋值给根节点的左子树和右子树。代码如下:
涉及到二叉树的问题用递归的方法很容易理解。这个问题要求把一个升序排序的链表转换为一颗height balanced BST。转换的方式就是把链表的中间值作为树的根节点,中间值的左半部分转换为二叉树的左子树,中间值的右半部分转换为二叉树的右子树。
递归解决问题的步骤如下:
1. 如果链表的长度为0,返回null;
2. 如果链表长度为1,创建新的二叉树节点node,node.left=null,node.right=null,node.val=head.val。
3. 否则的话找到链表的中间节点,即第mid = length%2==0?length/2:length/2+1个节点为根节点node。此时链表被分成两个部分,前半部分的长度为mid-1,后半部分的长度为length-mid,递归求这两部分的结果,并把他们分别赋值给根节点的左子树和右子树。代码如下:
public class Solution { public TreeNode sortedListToBST(ListNode head) { ListNode pointer = head; int length = 0; while(pointer!=null){ pointer = pointer.next; length++; } return listToBST(head, length); } public TreeNode listToBST(ListNode head,int length){ if(length==0) return null; if(length==1){ TreeNode node = new TreeNode(head.val); node.left = null; node.right = null; return node; } if(length==2){ TreeNode node = new TreeNode(head.val); node.left = null; node.right = listToBST(head.next, 1); return node; } int mid = length%2==0?length/2:length/2+1; ListNode pointer = head; ListNode righthead = null; int i = 1; while(pointer.next!=null && i<mid-1){ pointer = pointer.next; i++; } TreeNode node = new TreeNode(pointer.next.val); righthead = pointer.next.next; pointer.next = null; node.left = listToBST(head, mid-1); node.right = listToBST(righthead, length-mid); return node; } }
相关文章推荐
- css定位
- subprocess.Popen在win10下会有异常
- Android Bitmap换背景颜色
- Java 日期注解
- Hadoop伪分布式模式部署(接单机模式)
- 网站如何反爬虫浅析
- 学习日记
- Swift的Guard语句
- ARDUINO W5100 WebServer测试
- JSP的学习
- Jenkins+Github+Docker+Maven实现持续集成
- 屏幕适配
- Android笔记之用eclipse给zxing打jar包
- 使用mybatis插件自动生成实体(pojo)类
- 内存溢出和内存泄露、并行和并发、Minor GC和Full GC、Client模式和Server模式的区别
- javascript如何调用本地exe程序
- Rebar:Erlang构建工具(转载)
- 网络:NSURLSession 上传文件和代理的选择
- googleNet Inception v1 - v4 papers 发展历程
- android jni开发