IT公司100题-9-判断整数序列是不是二元查找树的后序遍历结果

时间:2021-02-04 17:46:13
问题描述:
输入一个整数数组,判断该数组是不是某二元查找树的后序遍历的结果。
如果是返回true,否则返回false。
例如输入4, 8, 6, 12, 16, 14, 10,由于这一整数序列是如下树的后序遍历结果:
 10
/     \
6      14
/  \    /   \
4   8 12    16
因此返回true。
如果输入6, 5, 8, 5, 7 ,则返回false。
 
分析:

在后续遍历得到的序列中,最后一个元素为树的根结点。根节点元素将数组分为两部分,左边都小于根节点,右边都大于根节点。递归的确认左右是否是二元查找树即可。

代码实现:

 // 9.cc
#include <iostream>
using namespace std; bool verify(int* a, int size) {
if (NULL == a || size <= )
return false; int root = a[size - ]; // 左侧节点比根节点小
int i = ;
while (i < size - && a[i] <= root)
i++; // 右侧节点比根节点大
for(int j = i; j < size - ; j++) {
if(a[j] < root)
return false;
} // 分别验证左右子树
bool left = true;
if(i > )
left = verify(a, i); bool right = true;
if(i < size - )
right = verify(a + i, size - i - ); return (left && right);
} int main() {
int a[] = {, , , , , , };
int size = sizeof(a) / sizeof(int);
bool flag = verify(a, size);
cout << flag << endl;
return ;
}