• 高度最小的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;
    }
  • 相关阅读:
    sprintf函数%u输入long long int型数值异常
    关于smarty模板display函数的$compile_id 参数的意义
    打log的时候如果少写一个%d,cgi会core掉
    c++标准库的源码和SIG实现是什么关系
    2010
    jquery 中jsonp原理最简说明
    1月17日stl string阅读笔记
    Moss母版页制作详解(一)
    Moss中的权限操作
    动态添加和删除表格行
  • 原文地址:https://www.cnblogs.com/liujinyao/p/4723270.html
Copyright © 2020-2023  润新知