0 题目
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
1 分析
后序遍历的结果,根节点在最后一个,前面的部分,前一部分是右子树,应该都小于根节点,后一部分是左子树,都大于根节点。
因此递归处理就可以了
public: bool VerifySquenceOfBST(vector<int> sequence) { return aux(sequence, 0, sequence.size() - 1); } bool aux(vector<int> sequence, int begin, int end) { if (sequence.empty() || begin > end) { return false; } int root = sequence[end]; int i = begin; // 找到右子树的第一个节点 for (; i < end; ++i) { if (sequence[i] > root) //i坐标为右子树第一个节点 break; } // 判断右子树是否符合要求 for (int j = i; j < end; ++j) { if (sequence[j] < root) return false; } // 递归判断左右子树 bool left = true; if (i > begin) { left = aux(sequence, begin, i - 1); } bool right = true; if (i < end - 1) { right = aux(sequence, i, end - 1); } return left && right; }
或是更改一下判断顺序
bool VerifySquenceOfBST(vector<int> sequence) { return aux(sequence, 0, sequence.size() - 1); } bool aux(vector<int> sequence, int begin, int end) { if (sequence.empty()) { return false; } if (begin >= end) { return true; } int root = sequence[end]; int i = begin; for (; i < end; ++i) { if (sequence[i] > root) //i坐标为右子树第一个节点 break; } for (int j = i; j < end; ++j) { if (sequence[j] < root) return false; } bool left = true; left = aux(sequence, begin, i - 1); bool right = true; right = aux(sequence, i, end - 1); return left && right; }