首页 > 代码库 > 判断数组是不是某二叉搜索树的后序遍历

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

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

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

// 二叉搜索树的遍历序列.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