zoukankan      html  css  js  c++  java
  • 108_将有序数组转换为二叉搜索树

    108_将有序数组转换为二叉搜索树

    package 二叉树.二叉搜索树;
    
    /**
     * https://leetcode-cn.com/problems/convert-sorted-array-to-binary-search-tree/
     * 
     * @author Huangyujun
     * 升序数组 转成高度平衡的二叉树(不断的new 结点),需要经过对比:高度平衡 二叉树是一棵满足「每个节点的左右两个子树的高度差的绝对值不超过 1 」的二叉树。
     * 升序对应升序的话,就是 小的在左边,大的在右边(这次要求大的力度是比原来左边大(小于等于1),否则,这个点null了,)题意应该将不超过改成不小于才是官网的解法呀
     * 
     * 题意:
     * 每个节点的左右两个子树的高度差的绝对值不超过 1 」的二叉树。
     * 然后官网的解法就是只是单纯把升序数组转成一颗平衡二叉树,我的天,我觉得官网的理解的题意有bug,此题理解点“每个节点的左右两个子树的高度差的绝对值不超过 1 」的二叉树。”是个问题
     */
    public class _108_将有序数组转换为二叉搜索树 {
    //    public TreeNode sortedArrayToBST(int[] nums) {
    //        TreeNode root = new TreeNode(nums[0]);
    //        int n = nums.length;
    //        TreeNode node = root;
    //        for(int i = 1; i < n; i++) {
    //            if(nums[i] <= nums[i - 1]) {    //小于等于前一个结点,作为左子树
    //                TreeNode left = new TreeNode(nums[i]);
    //                node.left = left;//需要同步 结点往下跑
    //                node = node.left;
    //            }else {    //看看,有没有机会做人家的右边(比较大的值)
    //                //比较前提是人间有了左子树呀
    //                if(node.left == null) {    //直接放到右边
    //                    TreeNode right = new TreeNode(nums[i]);
    //                    node.right = right;
    //                    node = node.right;
    //                }else if(Math.abs(nums[i] - node.left.val) <= 1) {
    //                    TreeNode right = new TreeNode(nums[i]);
    //                    node.right = right;//需要同步 结点往下跑
    //                    node = node.left;
    //                }else {
    //                    node.right = null;//需要同步 结点往下跑
    //                    node = node.left;
    //                }
    //            }
    //        }
    //        return root;
    //    }
        
        //官网答案:
        class Solution {
            public TreeNode sortedArrayToBST(int[] nums) {
                return helper(nums, 0, nums.length - 1);
            }
    
            public TreeNode helper(int[] nums, int left, int right) {
                if (left > right) {
                    return null;
                }
    
                // 总是选择中间位置左边的数字作为根节点
                int mid = (left + right) / 2;
    
                TreeNode root = new TreeNode(nums[mid]);
                root.left = helper(nums, left, mid - 1);
                root.right = helper(nums, mid + 1, right);
                return root;
            }
        }
    
    }

    本文来自博客园,作者:一乐乐,转载请注明原文链接:https://www.cnblogs.com/shan333/p/15709273.html

  • 相关阅读:
    github高效搜索使用总结
    使用redis防止商品超发
    yield对性能提升的一次小小测试
    实例直观解释sessionid的作用
    phper必知必会(二)
    phper必知必会(一)
    搭建laravel/homestead虚拟化开发环境
    【博客主题】自用主题备份 (SimpleMemory DIY)
    CentOS 7 配置清华大学EPEL镜像
    CentOS7网络配置-解决虚拟机更改网卡IP不生效问题
  • 原文地址:https://www.cnblogs.com/shan333/p/15709273.html
Copyright © 2011-2022 走看看