快捷搜索: 王者荣耀 脱发

判断数组是否为搜索二叉树的后序遍历

题目:

给一个整数型数组,在其中没有重复值的情况下,判断该数组是不是某二叉搜索树的后序遍历的结果。

如果是则输出false,否则输出true

解法思路(递归):

because 二叉树的后序遍历:左孩子—>右孩子—> 父结点

step1:如果一个数组arr是搜索二叉树的后序遍历结果,那arr的最后一个元素就是树的根结点root

step2:去掉最后一个元素arr[End]=root后, arr可以分成两段,(前一段 = 左子树)小于root,(后一段 = 右子树)大于root

step3: 分别递归前后两段,如果这(两段 = 子树)都是符合上述规则的。则输出true,否则输出false

例如:

input:arr = [2,4,6,5,3,7,10,9,8]

step1:根节点 root=8

step2:(前一段=左子树):[2,4,6,5,3,7] (后一段=右子树):[10,9]

step3: 前、后两段都符合规则

output:true

java实现:

public class verifySquenceOfBSTpostOrder {
	public boolean solve(int[] arr){
		if(arr == null || arr.length == 0){
			return true;
		}
    	return judge(arr,0,arr.length-1);
	}
	
	boolean judge(int[] arr, int Start, int End){
		if(Start >= End){return true;}
	    //找到,根节点位置
		int i = End ;
		
		//找到左右子树临界位置
		while (i > 0 && arr[i-1] > arr[End]){ 
			--i;
		}
		
		//判断左边部分是不是都小于根节点
		for( int j = i-1; j > 0; --j){
			if(arr[j] > arr[End])
			    return false;
		}
		
		//分别递归左右子树
		return judge(arr, Start, i-1) && judge(arr, i, End-1);
		}
}
public class verifySquenceOfBSTpostOrder { public boolean solve(int[] arr){ if(arr == null || arr.length == 0){ return true; } return judge(arr,0,arr.length-1); } boolean judge(int[] arr, int Start, int End){ if(Start >= End){return true;} //找到,根节点位置 int i = End ; //找到左右子树临界位置 while (i > 0 && arr[i-1] > arr[End]){ --i; } //判断左边部分是不是都小于根节点 for( int j = i-1; j > 0; --j){ if(arr[j] > arr[End]) return false; } //分别递归左右子树 return judge(arr, Start, i-1) && judge(arr, i, End-1); } }

经验分享 程序员 微信小程序 职场和发展