• 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

  • 相关阅读:
    IOS sqlite数据库增删改查
    宏定义偷懒型set,get
    创业白手起家也须要条件——北漂18年(14)
    Python模拟登录wap版百度贴吧+自己主动回贴
    纯CSS制作冒泡提示框
    tiny210(s5pv210)移植u-boot(基于 2014.4 版本号)——移植u-boot.bin(打印串口控制台)
    ZOJ 3587 扩展KMP
    用选择法对10个整数按从小到大排序(数组)
    设计一个算法,推断一个二叉树是否为全然二叉树
    Hibernate学习笔记(八) — 懒载入与抓取策略
  • 原文地址:https://www.cnblogs.com/shan333/p/15709273.html
Copyright © 2020-2023  润新知