刷题笔记(1) 一个序列是否为二叉搜索树的遍历结果

1.输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。

二叉搜索树:具体定义:https://blog.csdn.net/zj1131190425/article/details/88654541

是一棵二叉树,可能为空,非空的二叉搜索树满足以下特征:

1.每个元素都有唯一的关键字

2.根节点的左子树中,元素的关键字都小于根节点的关键字

3.根节点的右子树中,元素的关键字都大于根节点的关键字

4.根节点左右子树也都是二叉搜索树

根据二叉搜索树的定义来做:

class Solution {
public:
bool VerifySquenceOfBST(vector<int> sequence)
{
int size = sequence.size();
if(size==0)
return false;
vector<int> left; // 左子树
vector<int> right; // 右子树
int root = sequence[size-1]; // 根节点
int i; // 寻找左右子树的分界点
for(i=0; i<size-1; i++)
{
if(sequence[i]>root)
{
break; // 找到左右分解
}
}
for(int j=i; j<size-1; j++)
{
if(sequence[j]<root)
return false;
}
if(i!=0) // 有左子树
{
for(int j=0; j<i; j++)
{
left.push_back(sequence[j]);
}
}
if(i!=size-1-1) // 有右子树
{
for(int j=i; j<size-1; j++)
{
right.push_back(sequence[j]);
}
}
if(left.size()>1)
VerifySquenceOfBST(left);
if(right.size()>1)
VerifySquenceOfBST(right);
return true;
}
};

这道题目利用递归的方法解题:

链接:https://www.nowcoder.com/questionTerminal/a861533d45854474ac791d90e447bafd
来源:牛客网

1、确定root;

2、遍历序列(除去root结点),找到第一个大于root的位置,则该位置左边为左子树,右边为右子树;

3、遍历右子树,若发现有小于root的值,则直接返回false;

4、分别判断左子树和右子树是否仍是二叉搜索树(即递归步骤1、2、3)。

 

posted @   Alpha205  阅读(88)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示