牛客网刷题之生成平衡二叉搜索树

题目描述:使用单链表构建平衡搜索树
给定一个单链表,其中的元素按升序排序,请将它转化成平衡二叉搜索树(BST)。
题目分析:
平衡搜索树是每个节点的左结点小于该节点,每个节点的右节点大于该节点,并且左树与右树的高度差不超过1。由于链表已经是有序的,因此构建平衡二叉搜索树时,将链表中最中间的节点设置为该树的树根,将链表分为两个子链表用来构建树的左孩子和右孩子。
代码如下:

public class Solution {
    public TreeNode sortedListToBST(ListNode head) {
        if(head==null){
            return null;
        }
        //递归结束的条件,链表中只有一个元素
        if(head.next==null){
            return new TreeNode(head.val);
        }
        //对于链表,双指针概念很重要,双指针能够找到中间位置的节点
        ListNode fastnode=head.next;
        ListNode slownode=head;
        //循环找到中间位置的节点
        while(fastnode.next!=null&&fastnode.next.next!=null){
            fastnode=fastnode.next.next;
            slownode=slownode.next;
        }
        //将链表中间的节点加入到树中
        TreeNode tree=new TreeNode(slownode.next.val);
        //该树的右孩子是中间节点的右边所组成的新链表
         tree.right=sortedListToBST(slownode.next.next);
         //左树为中间节点的左边链表,因此将中间节点的下一个节点指向空位置
        slownode.next=null;
        tree.left=sortedListToBST(head);
        return tree;
    }
    
}

题目描述:
给出一个升序排序的数组,将其转化为平衡二叉搜索树(BST)。
题目分析:
与上边的链表相同,是一个递归创建树的过程,中间位置的元素为树的根节点,左边的子数组为树的左子树,右边的子节点为右子树。在java中Arrays.copyOfRange(source,start,end)表示将source数组复制其start到end的元素为新数组。
代码如下:

public class Solution {
    public TreeNode sortedArrayToBST(int[] num) {
          if(num.length<=0){
            return null;
        }
       //递归结束条件,如果数组中只剩一个元素,则将该元素创建一个树的节点返回
        if(num.length==1){
            return new TreeNode(num[0]);
        }
        //中间位置的数为树的根节点
        TreeNode tree=new TreeNode(num[num.length/2]);
        //将数组分成另个子数组构建树的左树与书的右树
        tree.left=sortedArrayToBST(Arrays.copyOfRange(num, 0, num.length/2));
        tree.right=sortedArrayToBST(Arrays.copyOfRange(num,  num.length/2+1,num.length));
        return tree;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值