【LeetCode题目记录-9】排序后的数组生成平衡的二叉搜索树

Convert Sorted Array to Binary Search Tree

Given an array where elements are sorted in ascending order, convert it to a height balanced BST.

【分析1-原创】中间值作为根节点,左边的中间值作为左孩子,右边的中间值作为右孩子。一直递归探底即可。

/**
 * Definition for binary tree
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
public class Solution {
    public TreeNode sortedArrayToBST(int[] num) {
        if(num==null) return null;
        //获取中间的值作为根节点
        TreeNode root=getMiddle(num,0,num.length-1);
        if(num.length==1) return root;
        //递归调用
        arrayToBST(num,0,num.length-1,root);
        return root;
    }
    private void arrayToBST(int[] num,int start,int end,TreeNode node){
        if(start>end) return;
        int middle=(start+end)>>1;
        node.left=getMiddle(num,start,middle-1);
        node.right=getMiddle(num,middle+1,end);
        arrayToBST(num,start,middle-1,node.left);
        arrayToBST(num,middle+1,end,node.right);
    }
    //获取中间的值作为节点
    private TreeNode getMiddle(int[] num,int start,int end){
        if(start>end) return null;
        return new TreeNode(num[(start+end)>>1]);
    }

}

【分析2-非原创】更简洁的写法。

https://oj.leetcode.com/discuss/6248/why-it-shows-runtime-error-when-using-my-recursive-code

 /**
     * Definition for binary tree public class TreeNode { int val; TreeNode
     * left; TreeNode right; TreeNode(int x) { val = x; } }
     */
    public class Solution {
        public TreeNode sortedArrayToBST(int[] num) {
            return arrayToBST(num, 0, num.length - 1);
        }

        private TreeNode arrayToBST(int[] num, int start, int end) {
            if (start > end)
                return null;
            int middle = start + (end - start >> 1);
            TreeNode root = new TreeNode(num[middle]);
            if (start != end) {
                root.left = arrayToBST(num, start, middle - 1);
                root.right = arrayToBST(num, middle + 1, end);
            }
            return root;
        }
    }
时间: 2024-11-05 20:37:18

【LeetCode题目记录-9】排序后的数组生成平衡的二叉搜索树的相关文章

判断某数组是否是某二叉搜索树的后序遍历的结果

题目: 输入一个数组,判断该数组是不是某二叉搜索树的后序遍历结果. 解答: 1 public class Solution { 2 3 public static void main(String[] args) { 4 int[] array = {5,7,6,9,11,10,8}; 5 6 boolean b = verfiySequenceOfBST(array, 0, 6); 7 System.out.println(b); 8 } 9 10 private static boolean

判断数组是否为某二叉搜索树的后序遍历

1 /************************************************************************* 2 > File Name: 22_SequenceOfBST.cpp 3 > Author: Juntaran 4 > Mail: [email protected] 5 > Created Time: 2016年08月30日 星期二 20时34分33秒 6 ***********************************

判断数组序列是否是二叉搜索树的后序遍历

#include <iostream> using namespace std; bool isPostorderOfBST(int postorder[], int low, int high) { if(postorder == NULL || low < 0 || high < 0) return false; if(low == high) return true; int pivot = high - 1; // 查找左子树与右子树的分界点 while(pivot >

树结构练习——排序二叉树的中序遍历(二叉搜索树)

树结构练习——排序二叉树的中序遍历 Time Limit: 1000MS Memory limit: 65536K 题目描述 在树结构中,有一种特殊的二叉树叫做排序二叉树,直观的理解就是——(1).每个节点中包含有一个关键值 (2).任意一个节点的左子树(如果存在的话)的关键值小于该节点的关键值 (3).任意一个节点的右子树(如果存在的话)的关键值大于该节点的关键值.现给定一组数据,请你对这组数据按给定顺序建立一棵排序二叉树,并输出其中序 遍历的结果. 输入 输入包含多组数据,每组数据格式如下.

[leetcode]669. Trim a Binary Search Tree寻找范围内的二叉搜索树

根据BST的特点,如果小于L就判断右子树,如果大于R就判断左子树 递归地建立树 public TreeNode trimBST(TreeNode root, int L, int R) { if (root==null) return null; if (root.val<L) return trimBST(root.right,L,R); if (root.val>R) return trimBST(root.left,L,R); TreeNode res = new TreeNode(ro

[leetcode]426. Convert Binary Search Tree to Sorted Doubly Linked List二叉搜索树转有序双向链表

Convert a BST to a sorted circular doubly-linked list in-place. Think of the left and right pointers as synonymous to the previous and next pointers in a doubly-linked list. Let's take the following BST as an example, it may help you understand the p

判断数组是不是某二叉搜索树的后序遍历

题目:输入一个数组,判断数组是不是某二叉搜索树的后序遍历.输入的数组的任意两个数字都不相同 分析:要明白题目的意思,意思就是判断一个数组是否是某个搜索树的后序遍历.首先要搞清搜索树的含义:跟结点大于左子树而小于右子树.其次,数组的最后一个结点一定是后序遍历的根节点.所以我们只要满足这两个条件,再通过递归就可以解出来了.代码如下: // 二叉搜索树的遍历序列.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream

[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], 它可以表示下面这个高

LeetCode(109):有序链表转换二叉搜索树

Medium! 题目描述: 给定一个单链表,其中的元素按升序排序,将其转换为高度平衡的二叉搜索树. 本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1. 示例: 给定的有序链表: [-10, -3, 0, 5, 9], 一个可能的答案是:[0, -3, 9, -10, null, 5], 它可以表示下面这个高度平衡二叉搜索树: 0 / -3 9 / / -10 5 解题思路: 这道题是要求把有序链表转为二叉搜索树,和之前那道Convert Sorted A