判断一棵二叉树是否为二叉搜索树
答案转载自:https://www.2cto.com/kf/201506/408372.html
裁判测试程序样例:#
#include <stdio.h> #include <stdlib.h> typedef enum { false, true } bool; typedef int ElementType; typedef struct TNode *Position; typedef Position BinTree; struct TNode{ ElementType Data; BinTree Left; BinTree Right; }; BinTree BuildTree(); /* 由裁判实现,细节不表 */ bool IsBST ( BinTree T ); int main() { BinTree T; T = BuildTree(); if ( IsBST(T) ) printf("Yes\n"); else printf("No\n"); return 0; } /* 你的代码将被嵌在这里 */
错误解法:#
1 bool isBST(Node* node) 2 { 3 if (node == NULL) 4 return true; 5 6 //如果左孩子大于根节点,则不是BST 7 if (node->left != NULL && node->left->key> node->key) 8 return false; 9 10 //如果右孩子节点小于根节点,则不是BST 11 if (node->right != NULL && node->right->key < node->key) 12 return false; 13 14 //递归的判断 15 if (!isBST(node->left) || !isBST(node->right)) 16 return false; 17 18 //检测完毕,所有条件通过,则是BST 19 return true; 20 }
这种判断方法是错误的,如下面例子所示,节点4处于根节点3的左子树中,但是函数检测到这棵树是BST.
正确解法:#
1 //判断是否为BST 2 bool IsBST(BinTree T) 3 { 4 return(isBSTUtil( T, -10000, 10000)); 5 } 6 7 //如果是一颗二叉查找树,且值范围在[min, max],则返回true 8 bool isBSTUtil(BinTree T , int min , int max ) 9 { 10 //空树也是BST 11 if ( T == NULL) 12 return true; 13 14 //如果节点值违反了最大/最小约束条件,则不是BST 15 if ( T->Data < min || T->Data > max) 16 return false; 17 18 //递归检查子树 19 return isBSTUtil( T->Left, min, T->Data - 1) && 20 isBSTUtil( T->Right, T->Data + 1, max); 21 }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南