判别一个数组是不是排序二叉树后序遍历ITeye - AG环亚娱乐

判别一个数组是不是排序二叉树后序遍历ITeye

2019-01-12 09:46:22 | 作者: 从寒 | 标签: 数组,一个,判别 | 浏览: 2469

碰到一个标题,判别一个数组是不是排序二叉树的后序遍历,所谓排序二叉树,指的是关于二叉树中的根节点比左子节点数值大,一起比右子节点数值小,例如[5,7,6,9,11,10,8] 便是一个排序二叉树的后序遍历,而[7,10,8,9]则不是

 

解题思想:

既然是后序遍历,则数组最终一个数值必定是根节点,而从左到右,剩余数组元素的左面值必定小于根节点值,而其他的数组元素则大于根节点,例如[5,7,6,9,11,10,8]这个数组,8必定是根节点,而从数组左面到5~6三个数比8小,必定是左子树,而剩余的9~10应该便是右子树,右子树应该满意每个数字都比根节点大,假如满意的话,咱们再把[5,7,6]和[9,11,10]两个部分的数组元素重复进行之前的操作,知道完毕

 

依照这个思路剖析一下[7,10,8,9]为什么不是,首要9为根节点,从数组左面找到比8小的元素组,该元素组的最终一个元素是7,因而,左子树应该是7,而剩余的[10,8,9]应该是右子树,右子树应该满意的条件是每个数字都比根节点9大,但是8比9小,所以不满意

 

了解这点的话能够写出如下程序

/*
author:luchi
date:2015/10/21 
#include iostream 
using namespace std;
//判别函数 
bool isValidate(int a[],int begin,int end){
 //假如begin =end表明待剖析的数组元素部分只要一个值或许没有值,回来true 
 if(begin =end) return true;
 //找到根节点 
 int root=a[end];
 int i=begin;
 //找到最终一个比根节点小的元素方位 
 while(a[i] =root){
 i++;
 int seperator=i;
 //递归判别左面是不是满意 
 bool isLeftValidate=(a,begin,seperator-1);
 bool isRightValidate=true;
 //判别右边节点是不是比根节点大,假如不是的话,表明右边不满意,回来false 
 for(int j=seperator;j =end-1;j++){
 if(a[j] root){
 isRightValidate=false;
 break;
 //假如右边满意当时的根节点的话,则递归判别剩余的右边元素是不是满意 
 if(isRightValidate){
 isRightValidate= isValidate(a,seperator,end-1);
 //只要左面和右边都满意了才回来true 
 return (isLeftValidate isRightValidate) ;
int main(){                          
			
版权声明
本文来源于网络,版权归原作者所有,其内容与观点不代表AG环亚娱乐立场。转载文章仅为传播更有价值的信息,如采编人员采编有误或者版权原因,请与我们联系,我们核实后立即修改或删除。

猜您喜欢的文章