jake1036

面试100题-06

  面试100题-06  判断数组是否是查找二叉树的输入序列

 一 问题描述: 
该题目主要判读输入的数组,是否是查找树的后序遍历序列 ,比如一个数组 5,7,6,9,11,10,8就是一个数组序列
这就需要利用后序遍历查找树的一些性质 。
从头开始扫描数组,当发现第一个位置i处,a[i]大于最后一个元素,则就有从i元素开始的每一个元素都大于尾部。
若发现不满足上述定理,则证明该数组不是后序遍历序列。

解决方法:
 利用递归方法,首先确定遍历数组,找出第一个大于尾部元素位置,即为i。然后从i开始扫描到尾部判读是否都比
 尾部元素大。同理扫描1-i-1 元素,判断是否都比a[i]大。

  使用了分治算法,用以解决该问题。

二 代码如下:
  
#include <iostream>
 
using namespace std ;
 
const int N = 7 ;
 
int a[N] ={5 , 7 , 6 , 9 , 11 , 10 , 8};
 
bool judge(int l , int h)
 
{
   
if(l <= h)
   

     
int i , j ;     
     
for(i = l ; i <= h ; i++)//很可能右子树或者左子树为空,考虑此种情况 
     {
       
if(a[i] >= a[h])
        
break ;            
     }

     
     
for(j = i ; j < h ;j++
      
{
        
if(a[j] < a[h]) //若出现比尾部小的值,则返回false 
          return false ;   
      }

     
     
bool  fl = true ;
     
if(l <= i - 1)
      fl 
= judge(l, i - 1) ;
     
     
bool rl = true ;
     
if(i <= h - 1)
     rl 
= judge(i , h -1) ;
     
     
return fl && rl ;
   }
 
    
return false ;
   
      
      
 }

 
 
 
int main()
 
{
  
bool f = judge(0 , N -1) ;
  cout
<<f<<endl ;
  
  system(
"pause") ;
  
return 0 ;    
 }

 





posted on 2011-05-16 14:33 kahn 阅读(198) 评论(0)  编辑 收藏 引用 所属分类: 算法相关


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理