说起树的遍历,我们大家应该都比较熟悉。先序,中序,后序,层次遍历,那么今天,我们来讨论的是二叉搜索树遍历。
先说,我们剑指offer上面的判断一个序列是不是某一个二叉搜索树的后序遍历。 我们从二叉树的后序遍历以及二叉搜索树的特点入手。
也就是说二叉搜索树的后序遍历有什么特点:
我们的根结点是在序列的最后的,并且其左子树的结点都小于根结点,且大于其右子树的所有节点都大于根结点。
这样的话我们就可以用根结点来区分出其左子树和其右子树,从而递归的判断其左子树和其右子树是否满足要求。
一开始没有想到这样的情况,完全就是没有想到问题的特点以及问题的关键所在。。这对自己思考问题的方式是很值的反思的。
code:
<span style="font-size:18px;">class Solution {
public:
bool dfs(vector<int>sequence, int low, int high){
if(low >= high) return true;
int index = low, i;
for(i = low; i < high && sequence[i] < sequence[high]; ++ i);
index = i;
for( ; i < high; ++ i){
if(sequence[i] < sequence[high]){
return false;
}
}
if(dfs(sequence, low, index - 1) == false) return false;
if(dfs(sequence, index, high - 1) == false) return false;
return true;
}
bool VerifySquenceOfBST(vector<int> sequence) {
int len = sequence.size();
if(len == 0) return true;
return dfs(sequence, 0, len - 1);
}
};</span>
那么我们再来看二叉搜索树的中序遍历。
说起二叉搜索树的中序遍历,应该是最符合二叉搜索树的特点的遍历了,怎么说呢?我们知道二叉搜索树的中序遍历正好是一个递增(严格)的序列。
二叉搜索树的先序遍历:
我们的二叉搜索树的先序遍历完全可以类比二叉搜索树的后序遍历。
============ 能够想到的就这么些了=====================