题目:输入一个整数数组,判断该整数是不是某二叉搜索树的后序遍历的结果。如果是则返回true,否则返回false。假设输入的数组的任意两个数字都不相同。 解析:例如输入的数组{5,7,6,9,11,10,8}。则返回true。如果输入的数组是{7,4,6,5},则返回的是false。 方法一:递归思想,数组中的最后一个元素把数组分成两部分,左半部分数字都小于最后一个元素,右半部分数字都大于最后一个元素。然后递归的进入到左半部分和右半部分,当左右两部分的都是二叉搜索树的后序遍历序列时,才返回true。方法二:非递归思想。从数组的最后开始遍历,每遍历一个元素,查看当前元素之前的序列是不是二叉搜索树的后序遍历序列,如果不是,直接返回false。如果遍历到数组的首元素都满足二叉搜索树的后序遍历序列,则返回true。//判断当前序列是不是二叉搜索树的后序遍历序列 bool verify(vector<int> &arr, int start, int last) { //叶子节点,返回true if (start == last) return true; int i = start; for (; i < last; ++i) { if (arr[i] > arr[last]) break; } //i必须在start到last之间 if (i > start && i < last) { bool left = verify(arr, start, i - 1); bool right = verify(arr, i, last - 1); } //如果右半部分不是二叉搜索树,则返回false for (int j = i; j < last; ++j) { if (arr[j] < arr[last]) return false; } return left && right; } bool verifySequenceOfBST(vector<int> arr) { if (arr.empty()) return false; return verify(arr, 0, arr.size() - 1); }
bool verify(vector<int> arr) { if (arr.empty()) return false; int size = arr.size(); while (--size) { int i = 0; for (; i < size; ++i) { if (arr[i] > arr[size]) break; } for (; i < size; ++i) { if (arr[i] < arr[size]) return false; } } return true; }
二叉搜索树的后序遍历序列(递归与非递归)
最新推荐文章于 2024-10-07 17:03:47 发布