Author: Frank
描述:输入一个整数数组,判断该数组是否是某二叉搜索树的后序遍历的结果。假设数组中的任意两个数字互不相同。
分析:
对于二叉搜索树的任何一个节点满足:左子树所有结点<=根结点<=右子树所有结点。如下图所示的二叉搜索树,其后序遍历的序列为5,7,6,9,11,10,8.
在后序遍历序列中,最后一个数8为整个树的根结点。从前往后比8小的连续序列5,7,6为左子树上的结点,比8大的连续序列9,11,10为右子树上的结点。 然后用同样的方法分析这两个子序列:对于5,7,6来说,其对应一个子树,6为根结点,5为其左子树的结点,7为其右子树的结点;对于9,11,10来说亦然。这是一个递归的过程。
反例:如果输入的带判断的序列为7,4,6,5,则其根结点为5,由于第一个数7比5大,因此5结点没有左子树,7,4,6全部为右子树上的结点,但是4小于5,不符合二叉搜索树的定义,因此该序列不是一个二叉搜索树的后序遍历的序列。
bool JudgeSequence(int A[], int len)
{
if (A == NULL || len <= 0)
return false;
int root = A[len - 1];
//左子树的结点小于根结点
int index = 0;
for (index = 0; index <= len - 2; index++)
{
if (A[index] > root)
break;
}
//右子树的结点大于根结点
int index2 = index;
for (; index2 <= len - 2; index2++)
{
if (A[index2] < root)
return false;
}
//判断左子树是否是二叉搜索树
bool left = true;
if (index >= 2)//index:左子树的元素的个数
left = JudgeSequence(A, index);
//判断右子树是否是二叉搜索树
bool right = true;
if (index <= len-2)
right = JudgeSequence(A, index);
return (left&right);
}
测试(vs2015)
#include "stdafx.h"
#include "stdlib.h"
typedef struct BinaryTreeNode
{
int data;
struct BinaryTreeNode* left;
struct BinaryTreeNode* right;
}BinaryTreeNode;
BinaryTreeNode* CreatBinaryNode(int data)
{
BinaryTreeNode* temp = (BinaryTreeNode*)malloc(sizeof(BinaryTreeNode));
temp->data = data; temp->left = NULL; temp->right = NULL;
return temp;
}
int main()
{
BinaryTreeNode* pHead = NULL;
int List[7] = {5,7,6,9,11,10,8};
bool bFlag = JudgeSequence(List, 7);
printf("bFlag=%d\n",bFlag);
int List2[3] = { 1,7,6};
bFlag = JudgeSequence(List2, 3);
printf("bFlag=%d\n", bFlag);
int List3[3] = { 8,7,6 };
bFlag = JudgeSequence(List3, 3);
printf("bFlag=%d\n", bFlag);
getchar();
return 0;
}
参考:
《剑指offer》---何海涛