为何该二叉搜索树构建实现中序遍历无序?传入数组需预先排序吗?
问题核心拆解
你实现的binarySearchTree函数从根本上就没有构建符合规范的二叉搜索树(BST),这才是乱序输入时中序遍历得不到有序序列的核心原因。
你的构建逻辑的本质缺陷
逐行拆解代码的实际执行逻辑就能看到设计问题:
- 每次创建完当前节点后,只会取出数组中紧邻当前元素的下一个值,和当前节点做大小比较,选择走左子树还是右子树的递归分支
- 递归进入对应分支后,又只会重复“创建节点→拿下一个相邻元素比大小→选一个分支往下递推”的操作,完全不会校验剩余所有待入树的元素,和当前整棵树各个节点的大小关系
拿你测试用的数组{10,9,8,7,101,5,4,3,2,1}走一遍实际建树流程:
- 首元素10作为根节点,下一个元素9≤10,递归创建10的左子树
- 左子树根节点是9,下一个元素8≤9,递归创建9的左子树
- 左子树根节点是8,下一个元素7≤8,递归创建8的左子树
- 左子树根节点是7,下一个元素101>7,递归创建7的右子树
- 右子树根节点是101,下一个元素5≤101,递归创建101的左子树
- 后续的4、3、2、1会一直沿着101的左分支不断向下挂载
最终建出来的树完全不符合BST的定义:BST要求任意节点的整棵左子树的所有节点值都小于当前节点,整棵右子树的所有节点值都大于当前节点。但在这棵树里,7的右孩子挂了101,101的左子树里又挂了值为5的节点——5比7还小,本来应该放在10的左子树、9的左子树、8的左子树、7的左子树的位置上,结果被错挂到7的右子树下面,直接违反BST规则,中序遍历自然得不到有序序列。
为什么传入排序后的数组时,中序遍历能得到有序结果
这只是巧合下的歪打正着,不是代码逻辑本身正确:
如果传入升序排列的数组,比如{1,2,3,4,5,7,8,9,10,101},按照现有代码逻辑执行:
- 根节点是1,下一个元素2>1,递归创建1的右子树
- 右子树根节点是2,下一个元素3>2,递归创建2的右子树
- 全程会沿着右子树的分支一路向下,最终建出来的是一棵所有右孩子依次连接的单枝树,没有任何左分支
这种结构下做中序遍历,流程是“访问空左子树→打印当前节点→遍历右子树”,按顺序走完刚好就是升序序列,看起来结果是对的,但本质上根本没有构建出真正的BST。
常见疑问澄清
传入的数组必须预先排序吗?
完全不需要。
只要实现了正确的BST构建逻辑,不管输入数组是乱序、逆序还是其他任意排列,最终建出来的都是符合规范的BST,中序遍历必然得到升序序列。你之前观察到的“排序后结果正确”,只是错误的构建逻辑刚好在升序输入下能产出符合遍历预期的结构,不是BST本身要求输入必须有序。
现有代码的修正方向
你现在的构建逻辑缺少核心步骤:对每个待插入的元素,必须从根节点开始逐位遍历,找到符合BST规则的空位置插入,而不是只比较相邻的数组元素、沿着一个分支把剩余元素全部塞完。
内容的提问来源于stack exchange,提问作者s.tiss
相关产品推荐
相关产品推荐

