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

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

https://leetcode-cn.com/problems/convert-sorted-array-to-binary-search-tree/description/

package com.test;

public class Lesson108 {
    public static void main(String[] args) {
        int[] nums = {-10,-3,0,5,9};
//        int[] nums = {0,1,2,3,4,5,6,7,8};
//        int[] nums = {0,1,2,3,4,5,6};
        TreeNode treeNode = sortedArrayToBST(nums);
        printNode(treeNode);
//        TreeNode t1 = new TreeNode(1);
//        TreeNode t2 = new TreeNode(2);
//        TreeNode t3 = new TreeNode(3);
//        t1.left = t2;
//        t1.right = t3;
//        printNode(t1);

    }
    public static TreeNode sortedArrayToBST(int[] nums) {
        int length = nums.length;
        TreeNode res = bst(0, length, nums);
        return res;
    }

    private static TreeNode bst(int start, int end, int[] nums) {
        // 如果有三个点
        if (end - start - 3 == 0) {
            TreeNode res = new TreeNode(nums[start+1]);
            TreeNode left = new TreeNode(nums[start]);
            TreeNode right = new TreeNode(nums[start+2]);
            res.left = left;
            res.right = right;
            return res;
        }
        // 如果有两个点
        if (end - start - 2 == 0) {
            TreeNode res = new TreeNode(nums[start+1]);
            TreeNode left = new TreeNode(nums[start]);
            res.left = left;
            return res;
        }
        // 如果有一个点
        if (end - start - 1 == 0) {
            TreeNode res = new TreeNode(nums[start]);
            return res;
        }
        // 没有点
        if (start - end == 0) {
            return null;
        }
        // 如果有很多点,取中间的点作为树根,左侧的点作为左树,右侧的点作为右树
        int middle = start+ (end-start)/2;
        int num = nums[middle];
        TreeNode res = new TreeNode(num);
        TreeNode left = bst(start,middle,nums);
        TreeNode right = bst(middle+1,end,nums);
        res.left = left;
        res.right = right;
        return res;
    }

    private static void printNode(TreeNode treeNode) {
        if (treeNode == null) {
            return;
        }
        // 先根
        System.out.print(treeNode.val+" ");
        if (treeNode.left != null) {
            printNode(treeNode.left);
        }
        // 中根
//        System.out.print(treeNode.val+" ");
        if (treeNode.right != null) {
            printNode(treeNode.right);
        }
    }
}

原文地址:https://www.cnblogs.com/stono/p/9557314.html

时间: 2024-08-01 10:47:39

108. 将有序数组转换为二叉搜索树的相关文章

108. 将有序数组转换为二叉搜索树-BST与AVL (leetcode)

AVL,在本题中: 1.由于构造的树的AVL,其子树高度差不超过1. 所以在选值时,要选nums中间的值作为node 2.由于每一颗子树都是AVL,所以需要使用递归 每次都选择区间中值构造Node 代码借鉴官方答案: class TreeNode: def __init__(self, x): self.val = x self.left = None self.right = None class Solution: def sortedArrayToBST(self, nums: List[

LeetCode(108):将有序数组转换为二叉搜索树

Easy! 题目描述: 将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树. 本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1. 示例: 给定有序数组: [-10,-3,0,5,9], 一个可能的答案是:[0,-3,9,-10,null,5],它可以表示下面这个高度平衡二叉搜索树: 0 / -3 9 / / -10 5 解题思路: 这道题是要将有序数组转为二叉搜索树,所谓二叉搜索树,是一种始终满足左<根<右(另外一种更直白的解释,二叉搜索树:空

108 Convert Sorted Array to Binary Search Tree 将有序数组转换为二叉搜索树

将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树.此题中,一个高度平衡二叉树是指一个二叉树每个节点的左右两个子树的高度差的绝对值不超过1.示例:给定有序数组: [-10,-3,0,5,9],一种可行答案是:[0,-3,9,-10,null,5],它可以表示成下面这个高度平衡二叉搜索树:      0     / \   -3   9   /   / -10  5详见:https://leetcode.com/problems/convert-sorted-array-to-binary

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

问题描述: 将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树. 本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1. 示例: 给定有序数组: [-10,-3,0,5,9], 一个可能的答案是:[0,-3,9,-10,null,5],它可以表示下面这个高度平衡二叉搜索树: 0 / -3 9 / / -10 5 解题思路: 用数组最中间的的值将数组分为三部分:左半部分.中间值.右半部分: 用中间值构造节点,数组左半部分构造节点的左子树,右半部分右子树

LeetCode-108. 将有序数组转换为二叉搜索树

将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树. 本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1. 示例: 给定有序数组: [-10,-3,0,5,9], 一个可能的答案是:[0,-3,9,-10,null,5],它可以表示下面这个高度平衡二叉搜索树: 0 / -3 9 / / -10 5 注:输入数组是有序数组,直接递归,但我没想出来,参考了别人的代码: 1 /** 2 * Definition for a binary tree nod

[LeetCode] Convert Sorted Array to Binary Search Tree 将有序数组转为二叉搜索树

Given an array where elements are sorted in ascending order, convert it to a height balanced BST. 这道题是要将有序数组转为二叉搜索树,所谓二叉搜索树,是一种始终满足左<根<右的特性,如果将二叉搜索树按中序遍历的话,得到的就是一个有序数组了.那么反过来,我们可以得知,根节点应该是有序数组的中间点,从中间点分开为左右两个有序数组,在分别找出其中间点作为原中间点的左右两个子节点,这不就是是二分查找法的核

LeetCode108 将有序数组转为二叉搜索树

将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树. 本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1. 示例: 给定有序数组: [-10,-3,0,5,9], 一个可能的答案是:[0,-3,9,-10,null,5],它可以表示下面这个高度平衡二叉搜索树: 0 / -3 9 / / -10 5 /** * Definition for a binary tree node. * struct TreeNode { * int val; * Tr

[LeetCode] 109. 有序链表转换二叉搜索树

题目链接 : https://leetcode-cn.com/problems/convert-sorted-list-to-binary-search-tree/ 题目描述: 给定一个单链表,其中的元素按升序排序,将其转换为高度平衡的二叉搜索树. 本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1. 示例: 给定的有序链表: [-10, -3, 0, 5, 9], 一个可能的答案是:[0, -3, 9, -10, null, 5], 它可以表示下面这个高

有序链表转换二叉搜索树

问题描述: 给定一个单链表,其中的元素按升序排序,将其转换为高度平衡的二叉搜索树. 本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1. 示例: 给定的有序链表: [-10, -3, 0, 5, 9], 一个可能的答案是:[0, -3, 9, -10, null, 5], 它可以表示下面这个高度平衡二叉搜索树: 0 / -3 9 / / -10 5 解题思路: 将链表先转为数组,之后方法与将有序数组转换为二叉搜索树相同. 实现代码: private sta