33 二叉搜索树的后序遍历序列
题目
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出true,否则输出false。假设输入的数组的任意两个数字都互不相同。
举例:序列{5,7,6,9,11,10,8}是下图二叉搜索树的后序遍历结果。

C 语言题解
序列最后一个数字是根节点,序列剩余部分分成两部分,前一部分是左子树,后一部分是右子树。
左子树上所有节点的值均小于它的根节点;右子树上所有节点的值均大于它的根节点。
bool VerifySquenceOfBST(int sequence[], int length)
{
if (sequence == nullptr || length <= 0)
return false;
int root = sequence[length - 1];
// 在二叉搜索树中左子树的结点小于根结点
int i = 0;
for (; i < length - 1; i++)
{
if (sequence[i] > root)
break;
}
// 在二叉搜索树中右子树的结点大于根结点
int j = i;
for (; j < length - 1; j++)
{
if (sequence[j] < root)
return false;
}
// 判断左子树是不是二叉搜索树
bool left = true;
if (i > 0)
left = VerifySquenceOfBST(sequence, i);
// 判断右子树是不是二叉搜索树
bool right = true;
if (i < length - 1)
right = VerifySquenceOfBST(sequence + i, length - i - 1);
return (left && right);
}
C++ 题解
class Solution {
public:
bool VerifySquenceOfBST(vector<int> sequence)
{
vector<int> leftTree,rightTree;
if(sequence.empty())
return false;
int index = 0; // 标记左右子树界限
int len = sequence.size();
// 根结点
int root = sequence[len-1];
int i=0;
for(;i<len-1;++i)
{
// 找到第一个大于根结点的位置,则左边为左子树,右边为右子树
if(sequence[i]>root)
break;
}
// 循环时去除root,因此为len-1
for(int j=i;j<len-1;++j)
{
// 有一个小于root,则返回false
if(sequence[j]<root)
return false;
}
// 如果有左子树
if(i > 0)
{
for(int m=0;m<i;++m)
{
leftTree.push_back(sequence[m]);
}
}
// 如果有右子树
if(i < len-1)
{
for(int j=i;j<len-1;++j)
{
rightTree.push_back(sequence[j]);
}
}
// 看左右子树是否是二叉搜索树
bool left = true,right = true;
if(leftTree.size()>1)
left = VerifySquenceOfBST(leftTree);
if(rightTree.size()>1)
right = VerifySquenceOfBST(rightTree);
return (left&&right);
}
};
python 题解
# -*- coding:utf-8 -*-
class Solution:
def VerifySquenceOfBST(self, sequence):
# write code here
if not sequence:
return False
root = sequence[-1]
i = 0
# 把根排除,要不然死循环
for node in sequence[:-1]:
if node > root:
break
i += 1
# 找到左右子树分界的节点
for node in sequence[i:-1]:
if node < root:
return False
# 分别检验左右子树
left = True
if i:
left = self.VerifySquenceOfBST(sequence[:i])
right = True
if i < len(sequence) - 1:
right = self.VerifySquenceOfBST(sequence[i:-1])
return left and right

浙公网安备 33010602011771号