剑指offer:二叉搜索树的后序遍历

题目描述

输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。

输入描述

样例输入:
7
5 7 6 9 11 10 8
4
7 4 6 5
样例输出:
Yes
No

解题思路

一、非递归

  1. 对于一个二叉排序树而言,根节点大于左子树上任意节点,小于右子树上任意节点,并且没有值相同的节点。

  2. 后序遍历中,最后一个节点就是根节点。

  3. 所以可以不断去除序列最后一个值,如果是二叉排序树,那么一定存在一个位置,

    【0,index)之间的值小于序列最后一位,【index,end)之间的值大于序列最后一位,

    并且【0,end)长度一定等于arr.length-2

    public class Solution {
        public boolean VerifySquenceOfBST(int [] sequence) {
            int[] arr = sequence;
            if(arr == null || arr.length <= 0) return false;  //数组为空 或 长度为0
            int start = 0; int end = arr.length - 1;	
          	while(end > 0){		//去掉数组最后一个元素之前,一直循环
            	while(arr[start] < arr[end]){	//找到index,退出
                	start ++;		
                }
                while(arr[start] > arr[end]){ //从index向后比较
                	start ++;
                }
                if(start < end){	//start = end 说明是二叉排序树 ,start < end 说明不是
                	return false;
                }
                end --;		//去掉数组最后一个元素
                start = 0;	//start归0
            }
            return true;
        }
    }

二、递归

  • 对于整个序列而言,index是一个分界点,index左边的值都属左子树,index右边的值都属于右子树。

  • 【0,index)范围内的值是一颗新的二叉排序树,【index,end)范围内的的值是另一颗二叉排序树。

  • 可以将以root为根节点的二叉排序树不断分解成新的二叉排序树,再逐个比较是不是二叉排序树。

        public class Solution {
            public boolean VerifySquenceOfBST(int [] sequence) {
                int[] arr = sequence;
                if(arr == null || arr.length <= 0) return false;  //arr为空 或 arr为false
                return isBST(arr,0,arr.length-1);
            }
            private boolean isBST(int[] arr,int start,int end){
                if(start >= end){
                	return true; 		//说明已经分解到最小
                }
            	int root = arr[end];	
                int i = start;
                for(;i < end;i++){		//从start开始比较
                	if(arr[i] > root){	//找到index位置
                    	break;
                    }
                }
                int j = i;
                for(;j < end;j++){		//从index向后比较
                	if(arr[j] < root){	//出现小于arr[index]的元素,说明不是二叉排序树
                    	return false;
                    }
                }
                return isBST(arr,start,i-1) && isBST(arr,i,end-1); //向下分解
            }
        }
    
posted @ 2020-03-08 21:32  灵图  阅读(99)  评论(0)    收藏  举报