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

  • 相关阅读:
    Linux ansible 常用模块二
    Linux之ansible 常用模块
    flask websocket实现用例
    flask--上下文原理
    python Django
    python 并发编程 锁 / 信号量 / 事件 / 队列(进程间通信(IPC)) /生产者消费者模式
    并发编程 process 模块的方法及运用 僵尸与孤儿
    python 并发编程 操作系统 进程 并发.并行 及 同步/异步,阻塞/非阻塞
    python 网络编程粘包解决方案2 + ftp上传 + socketserver
    第一节 机器学习基础
  • 原文地址:https://www.cnblogs.com/shan333/p/15709273.html
Copyright © 2011-2022 走看看