zoukankan      html  css  js  c++  java
  • 第109题:有序链表转换二叉搜索树

    一. 问题描述

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

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

    示例:

    给定的有序链表: [-10, -3, 0, 5, 9],

    一个可能的答案是:[0, -3, 9, -10, null, 5], 它可以表示下面这个高度平衡二叉搜索树:

          0

          /

       -3   9

       /    /

    -10   5

    二. 解题思路

    本题思路:本题与第108题思路一样,只不过在一开始将链表转换成list,然后采用相同的步骤进行计算,具体参考第108题。

    三. 执行结果

    执行用时 :10 ms, 在所有 java 提交中击败了7.12%的用户

    内存消耗 :39.5 MB, 在所有 java 提交中击败了95.51%的用户

    四. Java代码

    class Solution {
        public TreeNode sortedListToBST(ListNode head) {
             if(head==null) {
                     TreeNode root=null ;
                     return root;
                 }else {
                     
                     List<Integer> list=new ArrayList<Integer>();
                     
                     while(head!=null) {
                         list.add(head.val);
                         head=head.next;
                     }
                     int num=list.size()/2;
                     List<Integer> leftlist=new ArrayList<Integer>(list.subList(0, num));
                     List<Integer> rightlist=new ArrayList<Integer>(list.subList(num+1,list.size()));
                    TreeNode root=new TreeNode(list.get(num));
                    getTree(leftlist,rightlist,root);
                    return root;
                 }   
        }
        
         public void getTree(List<Integer> leftlist,List<Integer> rightlist,TreeNode root) {
             if(leftlist.size()==0&&rightlist.size()==0) {
                 return;
             }
             
             if(leftlist.size()>0) {
             int leftnum=leftlist.size()/2;
             List<Integer> newleftlist=new ArrayList<Integer>(leftlist.subList(0, leftnum));
             List<Integer> newleftlistright=new ArrayList<Integer>(leftlist.subList(leftnum+1, leftlist.size())); 
             root.left=new TreeNode(leftlist.get(leftnum));
             getTree(newleftlist,newleftlistright,root.left);
             }
             
             if(rightlist.size()>0) {
             int rightnum=rightlist.size()/2;
             List<Integer> newrightlistleft=new ArrayList<Integer>(rightlist.subList(0, rightnum));
             List<Integer> newrightlistright=new ArrayList<Integer>(rightlist.subList(rightnum+1, rightlist.size()));
             root.right=new TreeNode(rightlist.get(rightnum));
             getTree(newrightlistleft,newrightlistright,root.right);
             }
         }
        
    }
  • 相关阅读:
    谈谈IE条件注释
    0916 编程实验一 词法分析程序
    C语言文法的理解
    复利究极算法
    0106递归下降语意分析
    0309 复利计算
    关于语法树和文法的评价
    10.22 词法分析程序实验心得
    0909 编译原理
    0302 关于就业方面的一些感想
  • 原文地址:https://www.cnblogs.com/xiaobaidashu/p/11834152.html
Copyright © 2011-2022 走看看