为何该二叉树被判定为无效二叉搜索树?
为什么这棵二叉树不是有效的二叉搜索树?
嘿,我来帮你把这个问题掰明白——很多刚接触二叉搜索树(BST)的开发者都会在规则理解上踩坑,先把核心规则说透,再用一个典型的无效例子来拆解分析。
二叉搜索树的核心规则(必须记牢!)
BST的约束是递归且全局的,不是只看单个节点的直接子节点:
- 对于树中的任意一个节点,其左子树里的所有节点的值都必须严格小于该节点的值
- 该节点的右子树里的所有节点的值都必须严格大于该节点的值
- 左子树和右子树本身也必须是有效的BST(递归满足上面两条)
划重点:是所有子节点,不是只看直接左/右孩子!这是最容易出错的地方。
以典型无效BST为例分析
比如下面这棵树,看起来好像每个节点的直接子节点都符合大小,但实际上是无效的:
5 / \ 1 4 / \ 3 6
我们一步步拆解问题:
- 先看根节点5:
- 左子节点1小于5,没问题;
- 但右子节点4小于5,这直接违反了“右子树所有节点必须大于当前节点”的规则——别以为只看直接右孩子的大小就行,右子树里的所有节点(包括4、3、6)都必须大于5才对!
- 再看右子树的节点4:
- 它的左子节点3小于4,右子节点6大于4,单独看这个子树是符合BST规则的,但因为4本身在根节点5的右子树里,而4<5,所以整个树的有效性已经被破坏了;
- 额外看节点3:
- 它是根节点5的右子树的节点,但3<5,同样违反了根节点的约束——哪怕它和直接父节点4的关系是对的,只要违反了上层节点的全局约束,整个树就无效。
简单说,BST的规则不是“每个节点比左孩子大、比右孩子小”,而是“每个节点要比左子树所有节点大,比右子树所有节点小”——这个全局约束是关键!
内容的提问来源于stack exchange,提问作者Siddhartha Madhav
相关产品推荐
相关产品推荐

