• 高度最小的BST


      题目:对于一个元素各不相同且按升序排列的有序序列,请编写一个算法,创建一棵高度最小的二叉查找树。给定一个有序序列int[] vals,请返回创建的二叉查找树的高度。

      由于没有让给出树的构造过程,所以可以直接通过归纳的方式计算得出结果。但是在这里我们仍旧使用递归的方式模拟树的构建,并最终得到二叉搜索树。题目中要求树的高度最小实际上是让构造一个平衡二叉树,或者说为了让左右两个子树的节点数量越接近越好。

    public class MinimalBST {
    
        public int buildMinimalBST(int[] vals) {
            if(vals.length == 1)
                return 1;
            if(vals.length == 2 || vals.length == 3)
                return 2;
            
            int leftLen = vals.length % 2 == 0 ? (vals.length / 2 - 1) : (int)(vals.length / 2);
            int rightLen = vals.length - leftLen - 1;
            
            int left[] = new int[leftLen];
            int right[] = new int[rightLen];
            for(int i = 0; i < leftLen; i++){
                left[i] = vals[i];
            }
            for(int i = 0; i < rightLen; i++){
                right[i] = vals[leftLen + i + 1];
            }
            
            return 1 + (buildMinimalBST(left) > buildMinimalBST(right) ? 
                buildMinimalBST(left) : buildMinimalBST(right));     
        }
        
    }
    View Code

      其中在编码的过程中遇到一个运算发优先级的问题。对于三目运算符(a ? b : c)是有必要用括号括起来的,因为 + 运算符的优先级要大于 > 优先级: 

    return 1 + (buildMinimalBST(left) > buildMinimalBST(right) ? buildMinimalBST(left) : buildMinimalBST(right));

      补充:如果题目要求构造出这样的二叉搜索树(BST)的话,可以用如下的方法(其中TreeNode为树的节点的数据结构):

    public TreeNode createMinimalBST(int arr[], int start, int end){
           if(end < start)
                return null;
    
           int mid = (start + end) / 2;
           TreeNode n = new TreeNode(arr[mid]);  //构造树的节点
           n.left = createMinimalBST(arr, start, mid - 1);
           n.right = createMinimalBST(arr, mid + 1, end);
           return n;
    }
  • 相关阅读:
    MySQL性能指标及计算方法(go)
    Flashback for MySQL 5.7
    oracle_外部表的两种实现方式oracle_loader[datapump]
    oracle数据库内存调整之增加内存
    Leetcode: Binary Tree Paths
    Leetcode: Verify Preorder Sequence in Binary Search Tree
    Leetcode: Meeting Rooms II
    Leetcode: Meeting Rooms
    Leetcode: Flatten 2D Vector
    Leetcode: Count Univalue Subtrees
  • 原文地址:https://www.cnblogs.com/liujinyao/p/4723270.html
Copyright © 2020-2023  润新知