二叉搜索树的后序遍历序列(剑指offer 面试题33)
题目描述:
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
二叉搜索树相关知识点:
1.左子树上所有节点的key值都小于或等于根节点。 2.右子树上所有节点的key值都大于或等于根节点。3.中序遍历二搜索树将得到有序数组。4.查找所需的最大次数等同于二叉查找树的高度。
注意:二叉搜索树不一定是平衡二叉树;
解题思路:
后序遍历二叉搜索树的最后一个元素是二叉搜索树的根节点,并且从后序遍历序列的开始会存在连续序列小于(或等于)根节点的数值,剩余的连续元素数值应该不小于根节点的数值;否则将不是二叉搜索树的后序遍历序列;递归地判断小于(或等于)根节点的连续序列以及剩余的不小于根节点的连续序列是否符合上述二叉搜索树后续遍历序列的特点,从而解决问题。
拓展:二叉搜索树先序遍历序列的判断思路类似,只是根节点的元素为序列的开头元素。
通过代码:
class Solution {
public:
bool VerifySquenceOfBST(vector<int> sequence) {
if(sequence.empty())
return false;
vector<int> leftSeq;
vector<int> rightSeq;
int len = sequence.size();
int rootNum = sequence[len - 1];
int i = 0;
for(;i < len - 1; ++i)
{
if(sequence[i] > rootNum)
break;
leftSeq.push_back(sequence[i]);
}
for(int j = i; j < len - 1; ++j)
{
if(sequence[j] < rootNum)
return false;
rightSeq.push_back(sequence[j]);
}
bool leftResult = true;
if(!leftSeq.empty())
{
leftResult = VerifySquenceOfBST(leftSeq);
}
bool rightResult = true;
if(!rightSeq.empty())
{
rightResult = VerifySquenceOfBST(rightSeq);
}
return leftResult && rightResult;
}
};
- 剑指offer 面试题24:二叉搜索树BST的后序遍历序列(的判断) 题解
- 剑指Offer_面试题24_二叉搜索树的后序遍历序列
- 剑指offer_面试题24_二叉搜索树的后序遍历序列(递归)
- 二叉搜索树的后序遍历序列------剑指offer面试题33
- 剑指offer-第四章解决面试题思路(判断一个数组是否为二叉搜索树的后序遍历序列)
- 剑指offer之面试题22:二叉搜索树的后序遍历序列
- 剑指Offer之面试题24:二叉搜索树的后序遍历序列
- 剑指Offer面试题33:二叉搜索树的后序遍历序列
- 剑指Offer面试题24二叉搜索树的后序遍历序列(递归),面试题25二叉树中和为某一值的路径(栈)
- 【剑指offer】面试题 33:二叉搜索树的后序遍历序列
- 剑指Offer 面试题33:二叉搜索树的后序遍历序列 Java代码实现
- (C++)剑指offer-23:二叉搜索树的后序遍历序列(举例让抽象具体化)
- 剑指Offer----面试题24:二叉搜索树的后序遍历序列
- 剑指offer-面试题24:二叉搜索树的后序遍历序列
- 剑指OFFER之从二叉搜索树的后序遍历序列(九度OJ1367)
- 剑指offer面试题24-二叉搜索树的后序遍历序列
- 【剑指Offer】面试题24:二叉搜索树的后续遍历序列
- 剑指offer-面试题24 二叉搜索树的后序遍历序列
- 【剑指Offer学习】【面试题24:二叉搜索树的后序遍历序列】
- 剑指offer 面试题24 二叉搜索树的后序遍历序列