题目:输入一个整数数组,判断该数组是否是某二叉搜索树的后序遍历的结果。若是是则返回true,不然返回false。假设输入的数组的任意两个数字都互不相同。ios
思路:由于是二叉搜索树,因此每一个根结点的左子树结点都比根结点小,右子树比根结点大。
例如输入{5,7,6,9,11,10,8},后序遍历确定是根结点最后遍历的,因此8为根结点,而后由于5,7,6比8小,因此在8的左边,9,11,10在右边。以此类推这个数组符合。
例如输入{7,4,6,5},5为根节点,由于7大于5,因此没有左子树,但4又小于5,矛盾,因此不符合。面试
#include<iostream> #include<cstdio> #include<deque> using namespace std; bool VerifyBst(int sequence[], int length) { if (sequence == NULL || length <= 0) { return false; } int root = sequence[length-1]; //在二叉搜索树中左子树结点小于根结点 int i = 0; for (; i < length - 1; i++) { if (sequence[i] > root) { break; } } //右子树大于根结点 int j = i; for (; j < length - 1; j++) { if (sequence[j] < root) { return false; } } //判断左子树是否是二叉搜索树 bool left = true; if (i > 0) { left = VerifyBst(sequence, i); } //判断右子树是否是二叉搜索树 bool right = true; if (i < length - 1) { right = VerifyBst(sequence + i, length - i - 1); } return (left && right); } int main() { int num[7] = {10,7,6,9,11,10,8}; bool result = VerifyBst(num, 7); if (result == 1) { cout << "true" << endl; } else { cout << "false" << endl; } //cout << (result == 1)?true : false << endl; return 0; }
相关题目:
输入一个整数数组,判断该数组是否是某二叉搜索树的前序遍历的结果。这和前面的问题的后序遍历很相似,只是在前序遍历获得的序列中,第一个数字是根节点的值。数组
触类旁通:
若是面试题是要求处理一棵二叉树的遍历序列,咱们能够先找到二叉树的根结点,再基于根结点把整棵树的遍历序列拆分红左子树对应的子序列和右子树对应的子序列,接下来再递归地处理这两个子序列。spa