title: 2019-8-20 二叉搜索树的后续遍历序列
tags: 算法,每日一题,二叉树
二叉搜索树的后序遍历序列
1. 题目描述
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
2. 题目解析
这道关键是要了解二叉搜索树的后序遍历的的特性。首先对于二叉搜索树有左子树上的元素都小于根节点,右子树上的元素都大于根节点。由于是后序遍历那么序列中最后一个元素一定是根节点。那么一定存在一个位置是左右子树的分界位置,这个位置的特点是左边的元素都比根节点小,右边的元素都比根节点大。这样实际上就把左右子树和根节点分离开了。这样再继续的递归下去看左右子树是否满足这个条件。如果都满足则说明该序列是二叉搜索树的后续遍历序列。
2.1 思路解析
使用递归实现:
首先递归基是当开始位置大于等于结束位置时返回true
,说明这个时候只有一个数了。
接下来就是查找左右子树分界位置对应的index
了,这个很简单遍历一遍从begin
到end
的序列,某个位置出现的元素比根大说明就是那个位置了。
然后再判断从index
到end
位置所有值是否都比根大,如果不是则返回false
。
如果是则继续递归比较左子树和右子树的情况,返回左子树和右子树的结果的与。
class Solution {
public:
bool VerifySquenceOfBST(vector<int> sequence) {
if(sequence.empty()) return false;
return verifyBST(0, sequence.size()-1, sequence);
}
bool verifyBST(int be, int end, vector<int>& sequence){
if(be >= end) return true; //这里必须是>=假定上一次是两个的情况,index=end,在右子树那边有index>end-1
int root = sequence[end];
//查找边界index,找到的index属于右子树
int index = be;
for(; index < end; ++index){
if(root < sequence[index]){
break;
}
}
//验证右子树的元素都大于根节点
for(int i=index; i < end; ++i){
if(sequence[i] < root) return false;
}
return verifyBST(be, index-1, sequence) && verifyBST(index, end-1, sequence);
}
};
更多关于编程和机器学习资料请关注FlyAI公众号。