判断给定数组是否是二叉树的前序思路如下,如果数组是前序遍历的结果,那么最后一个数,总是可以把这个数组完整的分作两段,前一段的数小于等于最后一个数,后一段的数大于等于最后一个数。然后继续递归判断分出来的两端子数组,他们也必须满足上述条件才行。
思路很简单,代码如下:
#include <assert.h>
#include <ctype.h>
#include <errno.h>
#include <limits.h>
#include <string.h>
#include <stdarg.h>
#include <stdlib.h>
#include <stdio.h>
//判断num是不是后序遍历结果
int is_postorder(int* num, int len)
{
int ret= 0;
if (len <= 2) {
return 1;
}
int separator_pos = 0;
int i = 0;
int sub_root_val = num[len - 1];
while ((i <= len - 2) && (num[i] <= sub_root_val)) {
i++;
}
separator_pos = i;
while ((i <= len - 2) && (num[i] >= sub_root_val)) {
i++;
}
if ((len - 1) != i) {
return 0;
}
return is_postorder(num, separator_pos)
&& is_postorder(num + separator_pos, len - separator_pos - 1);
}
//判断num是不是前序遍历结果
int is_preorder(int* num, int len)
{
int ret= 0;
if (len <= 2) {
return 1;
}
int separator_pos = 0;
int i = 1;
int sub_root_val = num[0];
while ((i <= len - 1) && (num[i] <= sub_root_val)) {
i++;
}
separator_pos = i;
while ((i <= len - 1) && (num[i] >= sub_root_val)) {
i++;
}
if (len != i) {
return 0;
}
return is_preorder(num + 1, separator_pos - 1)
&& is_preorder(num + separator_pos, len - separator_pos);
}
int main(int argc, char * argv[])
{
int num [] = {1,3,4,7,10,9,5};
//int num [] = {5,3,1,4,9,7,10};
//int num [] = {3,1,4,2};
int ret1 = is_postorder(num, sizeof(num)/sizeof(int));
int ret2 = is_preorder(num, sizeof(num)/sizeof(int));
printf("\nnum array is %s postorder\n", ret1 ? "" : "not");
printf("\nnum array is %s preorder\n", ret2 ? "" : "not");
return 0;
}