zoukankan      html  css  js  c++  java
  • 微软算法100题09 判断整数序列是不是二元查找树的后序遍历结果

    9. 判断整数序列是不是二元查找树的后序遍历结果
    题目:输入一个整数数组,判断该数组是不是某二元查找树的后序遍历的结果。
    如果是返回true,否则返回false。
    例如输入5、7、6、9、11、10、8,由于这一整数序列是如下树的后序遍历结果:
    8
    /
    6 10
    / /
    5 7 9 11
    因此返回true。
    如果输入7、4、6、5,没有哪棵树的后序遍历的结果是这个序列,因此返回false。

    思路:如果一个数组为BST的后序遍历结果 则最后一个元素必然为该BST的根节点 因为BST的特性是左子树必然全部小于根节点,右子树全部大于根节点,则我们可以从数组倒数第二个元素开始往前遍历,直到找到第一个小于根节点的元素,则从数组第一个元素到该元素之间的所有元素为左子树(包含),该元素到根节点元素之间的元素为右子树(不包含),先分别遍历左子树元素和右子树元素,如果左子树中有大于根节点的元素,则不符合BST的定义,同理如果右子树元素中有小于根节点的元素,也不符合BST的定义,如果验证通过,则用上述逻辑递归校验左子树和右子树

     1 package com.rui.microsoft;
     2 
     3 import java.util.Arrays;
     4 
     5 public class Test09_IsBSTByPostOrder {
     6 
     7     public static void main(String[] args) {
     8         //int[] origin = {5,7,6,9,11,10,8};
     9         int[] origin = {5,6,7,8,9,10,11};
    10         //int[] origin = {7,4,6,5};
    11         boolean flag = isBST(origin);
    12         System.out.println(flag);
    13     }
    14     
    15     public static boolean isBST(int[] input){
    16         boolean flag = false;
    17         int n = input.length;
    18         //n==0 means current tree is empty
    19         if(n==1 || n==0) return true;
    20         else{
    21             //the last element in the post-order query array must be the root node
    22             int root = input[n-1];
    23             int line = n - 2;
    24             //search the dividing line between left tree and right tree of the root
    25             while(input[line] > root && line >= 0){
    26                 line--;
    27             }
    28             //now the pointer line should be pointing to the last node of the leaf tree
    29             
    30             int[] left = Arrays.copyOfRange(input, 0, line+1);
    31             int[] right = Arrays.copyOfRange(input, line+1, n-1);
    32             
    33             if(!checkLeft(left, root) || !checkRight(right, root)) return false;
    34             if(isBST(left) && isBST(right))return true;
    35         }
    36         
    37         return flag;
    38     }
    39     
    40     private static boolean checkLeft(int[] left, int root){
    41         for(int i : left){
    42             if(i > root) return false;
    43         }
    44         return true;
    45     }
    46     
    47     private static boolean checkRight(int[] right, int root){
    48         for(int i: right){
    49             if(i < root) return false;
    50         }
    51         return true;
    52     }
    53 }
  • 相关阅读:
    浏览器滚动条高度的获取与设置
    aspx页面 按钮不响应回车键
    HTML5 canvas 圆盘抽奖
    spark 解决大文件造成的分区数据量过大的问题
    简单http文件服务器 (Python)
    调试分析工具 (C/C++)
    案例学习——网站高并发处理相关技术
    一致性哈希
    Linux 环境下程序不间断运行
    案例分析——BAT业务https化经历
  • 原文地址:https://www.cnblogs.com/aalex/p/4902293.html
Copyright © 2011-2022 走看看