Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4826687
  • 博文数量: 930
  • 博客积分: 12070
  • 博客等级: 上将
  • 技术积分: 11448
  • 用 户 组: 普通用户
  • 注册时间: 2008-08-15 16:57
文章分类

全部博文(930)

文章存档

2011年(60)

2010年(220)

2009年(371)

2008年(279)

分类: LINUX

2009-07-20 20:30:11

输入一个整数数组,判断该数组是不是某二元查找树的后序遍历的结果。如果是返回true,否则返回false 例如输入576911108,由于这一整数序列是如下树的后序遍历结果:
         8
       /  \
      6    10
    / \    / \
   5   7   9  11
因此返回true
如果输入7465,没有哪棵树的后序遍历的结果是这个序列,因此返回false
分析:这是一道trilogy的笔试题,主要考查对二元查找树的理解。
在后续遍历得到的序列中,最后一个元素为树的根结点。从头开始扫描这个序列,比根结点小的元素都应该位于序列的左半部分;从第一个大于跟结点开始到跟结点前面的一个元素为止,所有元素都应该大于跟结点,因为这部分元素对应的是树的右子树。根据这样的划分,把序列划分为左右两部分,我们递归地确认序列的左、右两部分是不是都是二元查找树。
 
 
 

#include <stdio.h>
#include <stdlib.h>


int check_walk(int A[], int length)
{
  int i = 0;
  int j;
  int left = 1;
  int right = 1;
  
  int x = A[length-1];
  
  while(A[i]<x)
    i++;
  
  for(j = i; j<length-1; j++)
   {
     if(A[j]<x)
     return 0;
    }
 
 if(i>0)
  left = check_walk( A, i);
 if(i<length-1)
  right = check_walk( A+i, length-i-1);
  
 return (left && right);
}
 
int main(int argc, char *argv[])
{
  int A[] = {5,7,6,9,11,12,8};
  printf("%d\n",check_walk(A, 7));
  
  system("PAUSE");    
  return 0;
}

阅读(1084) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~