将升序单链表/数组转换为平衡二叉树BST

给定一个单链表,其中的元素按升序排序,请将它转化成平衡二叉搜索树(BST)

 

递归:o(nlogn)

解题思路:

1.找到链表的中点mid,

2.记录mid前缀,断开链表

3.将mid放入到树中

4.递归head(左链表),mid.next(右链表)

import java.util.*;
/*
 * public class TreeNode {
 *   int val = 0;
 *   TreeNode left = null;
 *   TreeNode right = null;
 * }
 */
/*
 * public class ListNode {
 *   int val;
 *   ListNode next = null;
 * }
 */
public class Solution {
    /**
     *
     * @param head ListNode类
     * @return TreeNode类
     */
    //获取中间节点
    public ListNode getmid(ListNode head){
        ListNode slow=head;
        ListNode fast=head;
        ListNode pre_slow=null;//记录slow的前一个节点
        //快慢指针获取中点
        while(fast!=null&&fast.next!=null){
            pre_slow=slow;
            slow=slow.next;
            fast=fast.next.next;
        }
        if(pre_slow!=null)   pre_slow.next=null;//断开链表
        return slow;
    }
    public TreeNode sortedListToBST (ListNode head) {
        if(head==null){
            return null;
        }
        ListNode mid=this.getmid(head);
        //中间节点为树根节点
       TreeNode node=new TreeNode(mid.val);
       //如果只剩下一个节点,返回node
       if(head==mid){
           return node;
       }
       node.left=sortedListToBST(head);
       node.right=sortedListToBST(mid.next);
       return node;
    }
}

给出一个升序排序的数组,将其转化为平衡二叉搜索树(BST)

1.判空

2.递归左子树,右子树

import java.util.*;
/*
 * public class TreeNode {
 *   int val = 0;
 *   TreeNode left = null;
 *   TreeNode right = null;
 * }
 */
public class Solution {
    /**
     *
     * @param num int整型一维数组
     * @return TreeNode类
     */
    public TreeNode getBST(int[]num,int left,int right){
        if(num==null ||num.length<=0|| left>right){
            return null;
        }
//取中点
        int mid=left+(right-left+1)/2;
        //只有一个节点
        if(left==right){
            return new TreeNode(num[left]);
        }
        //根节点
        TreeNode root=new TreeNode(num[mid]) ;
        //递归左子树
        root.left=getBST(num,left,mid-1);
        //递归右子树
        root.right=getBST(num,mid+1,right);
        return root;
    }
    public TreeNode sortedArrayToBST (int[] num) {
        if(num==null ||num.length==0){
            return null;
        }
        return getBST(num,0,num.length-1);
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值