判断数组是不是某二叉搜索树的后序遍历

题目:输入一个数组,判断数组是不是某二叉搜索树的后序遍历。输入的数组的任意两个数字都不相同

分析:要明白题目的意思,意思就是判断一个数组是否是某个搜索树的后序遍历。首先要搞清搜索树的含义:跟结点大于左子树而小于右子树。其次,数组的最后一个结点一定是后序遍历的根节点。所以我们只要满足这两个条件,再通过递归就可以解出来了。代码如下:

// 二叉搜索树的遍历序列.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <iostream>
using namespace std;

bool isPostBST(int sequence[], int length)   //注意这里传入的sequence就是指向序列的第一个结点
{
    //1.容错性
    if (sequence==NULL||length<=0)
        return false;

    //2.先要找到序列的分界点,此时因为对左子树进行了遍历所以也相当于对左子树进行了判断
    int i;  //分界点
    for (i = 0; i < length - 1; i++)
    {
        if (sequence[i]>sequence[length - 1])
            break;
    }
   //3.对序列的右子树进行判断
    for (int j = i; j < length-1; j++)
    {
        if (sequence[j] < sequence[length - 1])
            return false;
    }
  //4.当左右子树都满足的时候就要进行递归
    if (i >= 1)//左边至少有两个点的时候
        return isPostBST(sequence, i);

    if (i <= length - 3)//右子树至少有两个点的时候
        return isPostBST(sequence + i, length -i-1);//i是左子树的数目,1是根节点的数目

    return true;
}

int _tmain(int argc, _TCHAR* argv[])
{
    //int s[] = {7,4,6,5};
    //int s[] = { 7, 8, 6, 5 };
    int s[] = { 5,7,6,9,11,10,8 };
    if (isPostBST(s,7))
        cout<< "输入的数组为某个二叉搜索树的后序遍历!" << endl;
    else
        cout<< "输入的数组不是任何二叉搜索树的后序遍历!" << endl;
    return 0;
}

结果:微笑

输入数组:5,7,6,9,11,10,8

image

输入数组:7,4,6,5

image

输入数组:7,8,6,5

image

posted @ 2014-06-15 22:36  menghuizuotian  阅读(1229)  评论(0编辑  收藏  举报