九度OJ-题目1367:二叉搜索树的后序遍历序列

题目链接地址:

九度OJ-题目1367:二叉搜索树的后序遍历序列


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

输入:
每个测试案例包括2行:
第一行为1个整数n(1<=n<=10000),表示数组的长度。
第二行包含n个整数,表示这个数组,数组中的数的范围是[0,100000000]。

输出:
对应每个测试案例,如果输入数组是某二叉搜索树的后序遍历的结果输出Yes,否则输出No。

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

样例输出:
Yes
No


解题思路:

因为二叉搜索树的左子树中的所有元素均小于根结点的值,右子树中的所有元素均大于根结点的值,而二叉搜索树的后序遍历序列中的最后一个元素为该二叉搜索树的根结点,所以整个后序遍历序列可以分为{左子树,右子树,根结点}3个部分。如果从题目所给的序列中的第一个元素开始遍历,能够遍历到该序列的最后一个元素(也就是根结点),也就是说序列满足{左子树,右子树,根结点}(左右子树可以为空树)这种结构,则表明该序列是合法的二叉搜索树的后序遍历序列,反之则证明其不合法。

举个栗子:对于测试数据

7
5  7  6  9  11   10  8
从序列的第1个元素5开始遍历,因为5 , 7 , 6都小于8,所以{5, 7, 6}是二叉搜索树的左子树;因为9, 11, 10都大于8,所以{9,11,10}是二叉搜索树的右子树,最后被遍历的就是根结点8了。

再举个栗子:对于测试数据
4
7  4   6   5
从序列的第1个元素7开始遍历,因为7大于5,所以二叉搜索树的左子树为空树,而7属于右子树。如果元素7之后的序列元素(不包含最后一个元素5)都大于5,那么该序列就满足{右子树,根结点}的结构,该序列就是合法的二叉搜索树的后序遍历序列;否则该序列是不合法的二叉搜索树的后序遍历序列。因为序列的第2个元素4小于5,所以可以判定该序列不是合法的二叉搜索树的后序遍历序列。
AC代码如下:

#include<stdio.h>
#define MAX 10000
int sequence[MAX];             // 输入的序列
 
/**
* 判断序列是否为二叉搜索树的后序遍历序列
* @param n  序列的元素个数
* @return bool  如果序列是合法的二叉搜索树后续遍历序列,则返回true; 否则返回false。
*/
bool isPostTraverseofBinarySearchTree(int n)
{
  int i,j,t;
  int root;                    // 保存二叉搜索树的根结点
  for(i = 0;i < n;i++)
  {
      scanf("%d",&sequence[i]);
  }
  root = sequence[n - 1];
  j = 0;                       // 遍历题目所给后序遍历序列的起点
  t = n - 1;                   // 遍历题目所给后序遍历序列的终点
  while(j < t && sequence[j] < root)   // 遍历二叉搜索树的左子树,左子树中的所有元素都小于根结点
  {
      j++;
  }
  while(j < t && sequence[j] > root)   // 遍历二叉搜索树的右子树,右子树中的所有元素都大于根结点
  {
      j++;
  }
  if(j == t)        // 表示后序遍历序列满足{左子树,右子树,根结点}的要求,该后续遍历序列是合法的
      return true;
  else
      return false;
}
 
int main()
{
    int n;
    bool result;
    while(EOF != scanf("%d",&n))
    {
      result = isPostTraverseofBinarySearchTree(n);
      if(true == result)
         printf("Yes\n");
      else
         printf("No\n");
    }
    return 0;
}
 
/**************************************************************
    Problem: 1367
    User: blueshell
    Language: C++
    Result: Accepted
    Time:10 ms
    Memory:1060 kb
****************************************************************/


你可能感兴趣的:(面试题,剑指offer)