二叉搜索树动画演示
左小右大一路往下走,删除时后继替上来。
键盘:← → 单步 ·空格 播放/暂停 · R 重置 ·Home/End 到两端
二叉搜索树把「找东西」变成「往下走」:每个节点左子树全比它小、右子树全比它大,查一个值只要从根开始比一次就丢弃一半方向,路径长度就是比较次数。这一页把插入、查找、删除三种操作分开演示,每一步高亮正在比较的节点和走进的方向,右侧中序序列同步刷新——它始终递增,就是这棵树没长歪的证据。
最难的是删除:摘掉一个有两个孩子的节点,随便动指针都会破坏大小关系。标准做法是找右子树里最小的值(也就是中序遍历里紧跟着它的「后继」)搬过来顶位,再把那个后继节点摘掉——页面上你会看到值搬家、边重连分成好几步逐个交代。另一条主线是退化:拿「正序」数据插一遍,树会塌成一条链表,查找从折半变成挨个问,这正是下一页 AVL 存在的理由。
二叉搜索树演示怎么用
- 切操作:顶部三档按钮切换插入、查找、删除演示,删除档会自动挑出当前树里的叶子、单孩子、双孩子节点各删一次。
- 换数据:规模控制插几个键,形态里正序和倒序专门用来围观退化;自定义栏可写一串用空格分隔的整数直接开跑。
- 盯中序:舞台下方的横排格子是这棵树的中序遍历,每插入或删除一次都会重算,出现递减就说明理解与实现有一处不对。
- 数比较:计数条累计比较与插入次数,对比随机数据与正序数据两组数字,能直观感到树高对查找代价的影响。
常见问题
删除有两个孩子的节点,为什么偏偏选中序后继?
后继是右子树最小值,它比被删节点左边的所有数都大、又比右子树其余数都小,搬过去正好接上班位;而且后继必然没有左孩子,摘它时只剩「叶子或单右孩子」两种简单情形。
为什么正序插入会把树拖成链表?
每个新键都比之前所有键大,一路沿右孩子往下挂,树高等于节点数。查找、插入都退化成线性,这是 BST 的结构性弱点,不是实现 bug。
相等的关键字放哪边?
本页的口径是不存重复:遇到已在树上的值只做比较不再插入,note 会点名说明。工程里要么挂左树要么挂右树,两种约定都存在,排序用途常靠挂右侧保住稳定性。