二叉搜索树后序遍历序列判定
二叉搜索树想必大家都非常熟悉。它是一颗二叉树,对于任意一个节点n均满足:n的左儿子值比右儿子小,n的右儿子值比左儿子大。
对于二叉搜索树的后序遍历是先访问子树根节点的左子树、右子树,最后在访问子树根节点。
上述二叉搜索树的后序遍历序列:1,7,9,8,5,17,15,20,10.
这里主要是解决二叉搜索树后序遍历序列判定问题,具体描述如下:
判断该数组是不是某二叉搜索树的后序遍历的结果。
输入:一个整数数组,假设输入的数组的任意两个数字都互不相同。
输出:如果是则输出Yes,否则输出No。
解决方案:考虑后序遍历最后输出的节点是根节点,则可以根据大小关系,将序列分成三部分:左子树序列,右子树序列,根节点。故而可以判断该序列是否为二叉搜索树后序遍历的结果。
1 #include <iostream> 2 #include <vector> 3 4 using namespace std; 5 6 /** 7 * 递归分解该序列,判断其是否为后序遍历结果 8 */ 9 bool fun(vector<int> sequence) 10 { 11 int length = sequence.size(); 12 //length=0: 某子树只含左或右子树时,另一子数为空 13 //length=1: 某子树不含左右子树 14 if (length <= 1) 15 return true; 16 int root = sequence[length-1]; 17 int i = 0, j = length - 2; 18 //得到左子树序列位置 19 while (i < length - 1 && sequence[i] < root)i++; 20 //得到右子树序列位置 21 while (j >= 0 && sequence[j] > root)j--; 22 //若为后序遍历结果,则i,j关系为i=j+1 23 if (i != j + 1) 24 return false; 25 else 26 { 27 vector<int> ltemp; 28 vector<int> rtemp; 29 //得到左子树序列 30 ltemp.insert(ltemp.begin(), sequence.begin(), sequence.begin()+i); 31 //得到右子树序列 32 rtemp.insert(rtemp.begin(), sequence.begin() + j + 1, sequence.end()-1); 33 int ll = ltemp.size(); 34 int lr = rtemp.size(); 35 //递归判断左子树和右子树 36 return fun(ltemp) & fun(rtemp); 37 } 38 } 39 40 /** 41 * 判断sequence是否为二叉搜索树后序遍历的结果 42 */ 43 bool VerifySquenceOfBST(vector<int> sequence) 44 { 45 //判断序列是否为空 46 if(sequence.size() <= 0) 47 return false; 48 return fun(sequence); 49 } 50 51 int main() 52 { 53 //测试数据 54 int a[7] = {4,8,6,12,16,14,10}; 55 //int a[5] = {5,4,3,2,1}; 56 vector<int> sq(a,a+7); 57 int length = sq.size(); 58 cout << VerifySquenceOfBST(sq) << endl; 59 return 0; 60 }