题目描述
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则返回true,否则返回false。假设输入的数组的任意两个数字都互不相同。(ps:我们约定空树不是二叉搜素树)
思路
由题是判断该序列是否为二叉搜索树的后序遍历,二叉搜索树为左节点<父节点<右节点的二叉树,而后序遍历的特点是根节点在最后;
由此可得在后序遍历序列中,小于根节点的值的结点位于左子树,大于根节点的值的结点位于右子树。
代码实现
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 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
| class Tree { public: bool VerifySquenceOfBST(vector<int> sequence) { if(sequence.empty()) return false; else if(sequence.size()==1||sequence.size()==2) return true; else { auto rootValue = sequence.back(); int index = 0; int lenth = sequence.size(); vector<int> left,right; if(sequence[0] > rootValue) { for(auto i = 0;i < lenth-1;++i) { right.push_back(sequence[i]); if(sequence[i] < rootValue) return false; } return VerifySquenceOfBST(right); }else if(sequence[lenth-2] < rootValue) { for(auto i = 0;i < lenth-1;++i){ left.push_back(sequence[i]); if(sequence[i] > rootValue) return false; } return VerifySquenceOfBST(left); }else { for(auto i = 0;i < lenth;++i){ if(sequence[i] < rootValue && sequence[i+1] > rootValue){ index = i; break; } } for(auto i = 0;i <= index;++i) { left.push_back(sequence[i]); if(sequence[i] > rootValue) return false; } for(auto i = index + 1; i < lenth;++i) { right.push_back(sequence[i]); if(sequence[i] < rootValue) return false; } return VerifySquenceOfBST(left) && VerifySquenceOfBST(right); } } } };
|