判断一颗二叉树是否为二叉搜索树
首先定义一个二叉树的结构体
struct BinaryTree { int value; BinaryTree* lson; BinaryTree* rson; };
- 第一种方法
int maxOf(BinaryTree* root) { if (root->rson) { return maxOf(root->rson); } return root->value; } int minOf(BinaryTree* root) { if (root->lson) { return maxOf(root->lson); } return root->value; } bool check(BinaryTree* root) { if (root == NULL) { return true; } // 如果左子树的最大值小于当前节点值并且右子树的最小值大于当前节点的值并且左右子树都是二叉搜索树,则返回true,否则返回false; if (root->lson != NULL && maxOf(root->lson) >= root->value) { return false; } if (root->rson != NULL && minOf(root->rson) <= root->value) { return false; } return check(root->lson) && check(root->rson); }
这里有一个误区:
// 错误代码 bool check(BinaryTree* root) { if (root == NULL) { return true; } if (root->lson != NULL && root->lson->value >= root->value) { return false; } if (root->rson != NULL && root->rson->value <= root->value) { return false; } return check(root->lson) && check(root->rson); }
反正我一开始是这样想的,所以注意一下上面这种错误写法。
- 第二种方法
int max = -2147483648; bool check(BinaryTree* root) { if (root == NULL) { return true; } if (!check(root->lson)) { return false; } if (max >= root->value) { return false; } return check(root->rson); }
这个代码就是一个中序遍历,如果value递增,说明是一颗二叉搜索树,否则不是。当然max的初始值设置为-2147483648之后二叉树中就不能出现-2147483648,否则会出错。也可以把max类型改成long long之后用更小的数。
分类:
数据结构与算法
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 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)