zoukankan      html  css  js  c++  java
  • 高度最小的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;
    }
  • 相关阅读:
    Elastic 技术栈之快速入门
    JDK8 指南(译)
    Intellij IDEA 使用小结
    面向对象1
    函数总结
    Python中i = i + 1与i + = 1的区别
    python中变量的交换
    python的数据类型的有序无序
    对列表里的字典按年龄从小到大排序
    centos7安装python3
  • 原文地址:https://www.cnblogs.com/liujinyao/p/4723270.html
Copyright © 2011-2022 走看看