二叉搜索树

来源:互联网 发布:大数据开发和数据挖掘 编辑:程序博客网 时间:2024/05/01 08:15

需求:

    给定一个二叉树的后序遍历序列,用整型数组存储序列,判断该二叉树是否是一个二叉树搜索树?

分析:

    二叉搜索树满足父节点的值大于其左子树的所有节点值,而小于右子树的所有节点值,就从这个特性入手。
    对于二叉树的后序遍历序列,最后一个数是该二叉树的根,根据大小关系可以将前面的数字部分分为两部分,一个是左子树,其值都小于根,一个是右子树,其值都大于根。对左右子树,用相同的办法求其根和左右子树,看是否满足大小关系,如果不满足就返回false。
    思想就是分治和递归。
应考虑的测试用例:
    1、如果数组是null,那么抛出异常
    2、如果数组长度是0,那么不是二叉搜索树
    3、如果数组长度是1,那么该树是二叉树搜索树

代码:

import java.util.*;//定义二叉树class BinTree{private String[] str;private List<Node> list;BinTree(String[] str){this.str = str;}//二叉树节点class Node{int val; Node left;Node right;Node(int val){this.val = val;this.left = left;this.right = right;}}//创建二叉树public void createBinTree(){list = new LinkedList<Node>();//遍历字符串,转换成对应的节点//对于特殊字符"#",将其转成nullfor(String s : str){if("#".equals(s)){list.add(null);}else{list.add(new Node(Integer.parseInt(s)));}}//构建父子节点之间的关系for(int index = 0; index < str.length/2-1; index++){list.get(index).left = list.get(index*2+1);list.get(index).right = list.get(index*2+2);}//单独处理最后一个父节点int lastIndex = str.length/2-1;//添加左儿子节点list.get(lastIndex).left = list.get(lastIndex*2+1);//如果数组长度是奇数,那么就有右儿子if(str.length % 2 != 0){list.get(lastIndex).right = list.get(lastIndex*2+2);}}//获取二叉树根节点public Node getRoot(){if(list != null){return list.get(0);}System.out.println("请先创建二叉树");return null;}}class IsBinSearchTree{//判断是否是二叉搜索树public static boolean isBinSearchTree(int[] arr){//如果是null,那么抛出异常if(arr == null){throw new IllegalArgumentException("invalid parameters");}//如果长度是0,那么该二叉树不是二叉搜索树if(arr.length == 0){return false;}//如果arr长度是1,那么返回true,说明是二叉搜索树if(arr.length == 1){return true;}//获取根节点值int root = arr[arr.length - 1];//定义左子树节点个数和右子树节点个数int leftcount = 0, rightcount = 0;for(; leftcount < arr.length-1; ){if(arr[leftcount] < root){leftcount++;}else{break;}}//从for循环中出来,要么是因为break,即出现了比根大是数,要么是因为leftcount=arr.length-1if(leftcount != arr.length-1){rightcount++;for(; rightcount+leftcount < arr.length-1; ){if(arr[rightcount+leftcount] > root){rightcount++;}else{//如果在右子树中出现了小于根的节点,那么说明该树不是二叉搜索树return false;}}}//现在已知左右子树的节点个数//如果左子树节点个数大于0,那么需要判断左子树是否是二叉搜索树boolean left = true, right = true;//代表左右子树是否是二叉搜索树,初始化为trueif(leftcount > 0){//创建左子树对应的后序遍历数组int[] leftarr = new int[leftcount];for(int i = 0; i < leftcount; i++){leftarr[i] = arr[i];}//判断左子树是否是二叉搜索树left = isBinSearchTree(leftarr);}if(rightcount > 0){//创建右子树对应的后序遍历数组int[] rightarr = new int[rightcount];for(int i = 0; i < rightcount; i++){rightarr[i] = arr[leftcount+i];}//判断右子树是否是二叉搜索树right = isBinSearchTree(rightarr);}//当两个子树都是二叉搜索树的时候才是二叉搜索树return left && right;}public static void main(String[] args){Scanner scan = new Scanner(System.in);System.out.println("请输入数组长度:");int[] arr = new int[scan.nextInt()];System.out.println("请输入数组元素:");for(int i = 0; i < arr.length; i++){arr[i] = scan.nextInt();}System.out.println("该数组是否是二叉搜索树的后序遍历数组?");System.out.println(isBinSearchTree(arr));}}