zoukankan      html  css  js  c++  java
  • LeetCode OJ 109. Convert Sorted List to Binary Search Tree

    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,递归求这两部分的结果,并把他们分别赋值给根节点的左子树和右子树。代码如下:

     1 public class Solution {
     2     public TreeNode sortedListToBST(ListNode head) {
     3         ListNode pointer = head;
     4                 
     5         int length = 0;
     6         while(pointer!=null){
     7             pointer = pointer.next;
     8             length++;
     9         }
    10         
    11         return listToBST(head, length);
    12  
    13     }
    14     
    15     public TreeNode listToBST(ListNode head,int length){
    16         if(length==0) return null;
    17         if(length==1){
    18             TreeNode node = new TreeNode(head.val);
    19             node.left = null;
    20             node.right = null;
    21             return node;
    22         }
    23         if(length==2){
    24             TreeNode node = new TreeNode(head.val);
    25             node.left = null;
    26             node.right = listToBST(head.next, 1);
    27             return node;
    28         }
    29         int mid = length%2==0?length/2:length/2+1;
    30         
    31         ListNode pointer = head;
    32         ListNode righthead = null;
    33         int i = 1;
    34         while(pointer.next!=null && i<mid-1){
    35             pointer = pointer.next;
    36             i++;
    37         }
    38         TreeNode node = new TreeNode(pointer.next.val);
    39         righthead = pointer.next.next;
    40         pointer.next = null;
    41         node.left = listToBST(head, mid-1);
    42         node.right = listToBST(righthead, length-mid);
    43         
    44         return node;
    45     }
    46 }
  • 相关阅读:
    项目管理和项目群管理的区别
    项目群管理
    PRINCE2如何完善PMBOK和您的PMP资格证书?
    为什么需要prince2项目管理方法论?
    PMP和PRINCE2到底有什么区别?哪个含金量更高?
    同步和异步
    Promise理解
    async和await实现异步的同步等待
    Mysql数据库操作基础步骤
    PHP和javascript区别
  • 原文地址:https://www.cnblogs.com/liujinhong/p/5415813.html
Copyright © 2011-2022 走看看