二叉搜索树的后序遍历序列(递归与非递归)

来源:互联网 发布:华育软件学院 编辑:程序博客网 时间:2024/05/30 07:12
    题目:输入一个整数数组,判断该整数是不是某二叉搜索树的后序遍历的结果。如果是则返回true,否则返回false。假设输入的数组的任意两个数字都不相同。    解析:例如输入的数组{5,7,6,9,11,10,8}。则返回true。如果输入的数组是{7,4,6,5},则返回的是false。    方法一:递归思想,数组中的最后一个元素把数组分成两部分,左半部分数字都小于最后一个元素,右半部分数字都大于最后一个元素。然后递归的进入到左半部分和右半部分,当左右两部分的都是二叉搜索树的后序遍历序列时,才返回true。
//判断当前序列是不是二叉搜索树的后序遍历序列bool verify(vector<int> &arr, int start, int last){//叶子节点,返回trueif (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);}//如果右半部分不是二叉搜索树,则返回falsefor (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);}
方法二:非递归思想。从数组的最后开始遍历,每遍历一个元素,查看当前元素之前的序列是不是二叉搜索树的后序遍历序列,如果不是,直接返回false。如果遍历到数组的首元素都满足二叉搜索树的后序遍历序列,则返回true。
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;}
0 0
原创粉丝点击