题目:输入一个数组,判断数组是不是某二叉搜索树的后序遍历。输入的数组的任意两个数字都不相同
分析:要明白题目的意思,意思就是判断一个数组是否是某个搜索树的后序遍历。首先要搞清搜索树的含义:跟结点大于左子树而小于右子树。其次,数组的最后一个结点一定是后序遍历的根节点。所以我们只要满足这两个条件,再通过递归就可以解出来了。代码如下:
// 二叉搜索树的遍历序列.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
输入数组:7,4,6,5
输入数组:7,8,6,5