【题目】
输入一个整数数组,判断该数组是不是某二元查找树的后序遍历的结果。如果是返回true,否则返回false。
例如输入5、7、6、9、11、10、8,由于这一整数序列是如下树的后序遍历结果:
8
/
6 10
/ /
5 7 9 11
因此返回true。
如果输入7、4、6、5,没有哪棵树的后序遍历的结果是这个序列,因此返回false。
【思路】
在后续遍历得到的序列中,最后一个元素为树的根结点。从头开始扫描这个序列,比根结点小的元素都应该位于序列的左半部分;从第一个大于跟结点开始到跟结点前面的一个元素为止,所有元素都应该大于跟结点,因为这部分元素对应的是树的右子树。根据这样的划分,把序列划分为左右两部分,我们递归地确认序列的左、右两部分是不是都是二元查找树。
【代码】
C++ Code
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
bool VerifySequenceOfBST(int a[], int n) { if (NULL == a || n < 0) return false; //if (n==1) //return true; int root = a[n - 1]; int i = 0; for (; i < n - 1; i++) { if (a[i] > root) break; } int j = i; for (; j < n - 1; j++) { if (a[j] < root) return false; } bool left = true; if (i > 0) left = VerifySequenceOfBST(a, i); bool right = true; if (i < n - 1) right = VerifySequenceOfBST(a + i, n - 1 - i); return (left && right); } |
【参考】
http://zhedahht.blog.163.com/blog/static/25411174200725319627/