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 }
  • 相关阅读:
    WCF 第八章 安全 确定替代身份(中)使用AzMan认证
    WCF 第八章 安全 总结
    WCF 第八章 安全 因特网上的安全服务(下) 其他认证模式
    WCF Membership Provider
    WCF 第八章 安全 确定替代身份(下)模仿用户
    WCF 第八章 安全 因特网上的安全服务(上)
    WCF 第九章 诊断
    HTTPS的七个误解(转载)
    WCF 第八章 安全 日志和审计
    基于比较的排序算法集
  • 原文地址:https://www.cnblogs.com/aalex/p/4902293.html
Copyright © 2011-2022 走看看