在BST中,最小值位于最左节点、最大值位于最右节点,可通过O(h)时间的迭代遍历左/右子树直接定位,无需排序或中序遍历;空树需判空防崩溃,且极值随结构动态变化,按需查找即可。

如何在BST中高效找到最小值和最大值
二叉搜索树(BST)的结构天然支持 O(h) 时间定位极值,其中 h 是树高。最小值一定在最左节点,最大值一定在最右节点——不需要遍历整棵树,更不用排序或额外容器。
常见错误是写成递归回溯或误用中序遍历找第一个/最后一个元素,既慢又绕。正确做法是沿左/右指针一路走到叶子。
- 查找最小值:从根开始,持续向
left子节点移动,直到left == nullptr - 查找最大值:从根开始,持续向
right子节点移动,直到right == nullptr - 空树需提前判断,否则解引用空指针会崩溃(如
root->left前没检查root)
迭代实现比递归更安全、更省栈空间
递归写法虽简洁,但深度较大时可能触发栈溢出;而迭代版本逻辑直白、无隐式调用开销,且更容易加入空指针防护。
示例(最小值):
立即学习“C++免费学习笔记(深入)”;
TreeNode* findMin(TreeNode* root) {
if (!root) return nullptr;
while (root->left) {
root = root->left;
}
return root;
}同理,findMax 把 left 换成 right 即可。注意返回的是节点指针,不是值——若只需值,取 root->val 即可,但别忘了判空。
为什么不能直接访问 root->left 或 root->right 作为极值
新手常误以为根节点的左子节点就是最小值,或右子节点就是最大值。这是对BST定义的误解:BST只要求左子树所有节点值
典型反例:
10
/ \
5 15
/ \ \
3 7 20
/
2这里 root->left 是 5,但最小值是 2;root->right 是 15,但最大值是 20。必须走到末端。
插入/删除后是否需要重新建树来更新极值
不需要。BST的极值只依赖当前树结构,每次查找都是独立计算。插入新节点可能改变极值(比如插入比当前最小还小的数),但无需“维护”极值变量——按需调用 findMin/findMax 即可,它们始终正确。
除非高频查询且树极少变动,才考虑缓存极值并手动更新;但普通场景下,重复调用 O(h) 查找比维护状态更简单、更不易出错。
最易被忽略的是边界:空树、单节点树、极值节点本身有子树(比如最小值节点有右子树)——这些都不影响算法,只要坚持“最左/最右”原则,就自然覆盖全部情况。


















