LeetCode-探索-初级算法-树-5. 将有序数组转换为二叉搜索树(个人做题记录,不是习题讲解)

LeetCode-探索-初级算法-树-5. 将有序数组转换为二叉搜索树(个人做题记录,不是习题讲解)

LeetCode探索-初级算法:https://leetcode-cn.com/explore/interview/card/top-interview-questions-easy/

  1. 将有序数组转换为二叉搜索树
  • 语言:java

  • 思路:感觉和上一题的层层递归的有点像,再加上左右子树最多高度相差一,我就想说每次取数组中值当作当前树的根节点,左边当作左子树,右边当作右子树,有点二分查找的感觉。没想到一次过了,挺高兴的。

  • 代码(1ms):

    /**
     * Definition for a binary tree node.
     * public class TreeNode {
     *     int val;
     *     TreeNode left;
     *     TreeNode right;
     *     TreeNode(int x) { val = x; }
     * }
     */
    class Solution {
        public TreeNode sortedArrayToBST(int[] nums) {
            return BST(nums);
        }
        
        public TreeNode BST(int[] nums){
            int len = nums.length;
            if(len>0){
                int middle = len/2;
                TreeNode node = new TreeNode(nums[middle]);
                node.left = BST(Arrays.copyOfRange(nums,0,middle));
                node.right = BST(Arrays.copyOfRange(nums,middle+1,len));
                return node;
            }
            return null;
        }
    }
    
  • 参考代码(1ms):感觉和我的差别不大,只不过它改用下标来代替获取子数组的方式,而我是直接暴力获取子数组(如果测试数据很大,肯定参考代码的优势就明显了)

    class Solution {
        public TreeNode sortedArrayToBST(int[] nums) {
            return toBST(nums, 0, nums.length - 1);
        }
        public TreeNode toBST(int[] nums, int i, int j) {
            if (i > j) {
                return null;
            }
            int mid = i + (j - i) / 2;
            TreeNode node = new TreeNode(nums[mid]);
            node.left = toBST(nums, i, mid - 1);
            node.right = toBST(nums, mid + 1, j);
            return node;
        }
    }
    
  • 参考后重写:

    /**
     * Definition for a binary tree node.
     * public class TreeNode {
     *     int val;
     *     TreeNode left;
     *     TreeNode right;
     *     TreeNode(int x) { val = x; }
     * }
     */
    class Solution {
        public TreeNode sortedArrayToBST(int[] nums) {
            return BST(nums,0,nums.length-1);
        }
        
        public TreeNode BST(int[] nums,int start,int end){
            if(end>=start){
                int middle = start + (end-start)/2;
                TreeNode node = new TreeNode(nums[middle]);
                node.left = BST(nums,start,middle-1);
                node.right = BST(nums,middle+1,end);
                return node;
            }
            return null;
        }
    }
    
发布了60 篇原创文章 · 获赞 6 · 访问量 5531

猜你喜欢

转载自blog.csdn.net/Ashiamd/article/details/102263511