每天一算法(判断该数组是不是某二元查找树的后序遍历的结果)
题目:输入一个整数数组,判断该数组是不是某二元查找树的后序遍历的结果。
如果是返回true,否则返回false。
例如输入5、7、6、9、11、10、8,由于这一整数序列是如下树的后序遍历结果.
8
/ \
6 10
/ \ / \
5 7 9 11
因此返回true。
如果输入7、4、6、5,没有哪棵树的后序遍历的结果是这个序列,因此返回false。
分析:
判断其是否为二元查找树的后序遍历结果,就需要知道后序遍历的特定:最后一个元素为根;又因为为二元查找树,即任意一个元素的值都大于左子节点的值,小于右子节点的值。所以,在遍历该序列时,从遇到第一个大于根元素的值开始一直到根元素之前,都是位于该元素的右子树上,而从第一个元素到第一个大于该根元素的值之前,都位于该根元素的左子树上;我们可以依此来对该序列进行左右子树划分,然后再对划分得到的左右子树递归……
bool IsAfer(int squ[], int length){ if(squ == NULL || length <= 0) return false; int root = squ[length - 1]; int i = 0; for(; i < length - 1; ++ i) { if(squ[i] > root) break; } int j = i; for(; j < length - 1; ++ j) { if(squ[j] < root) return false; } bool left = true; if(i > 0) left = IsAfer(squ, i); bool right = true; if(i < length - 1) right = IsAfer(squ + i, length - i - 1); return (left && right);}