二叉搜索树全局搜索问题:searchByYear方法无法打印全部匹配影片
问题分析与解决方案
嘿,我找到你代码里的问题啦!你的searchByYear方法之所以只能打印部分匹配结果,核心问题是当找到匹配年份的节点后,你没有继续遍历该节点的左右子树。
原代码的逻辑缺陷
看你这段代码:
private void searchByYear(BTNode root, int year) { BTNode temp = root; if(temp == null) return; else if(temp.data.titleYear == year){ System.out.println(temp.data.title); } else{ searchByYear(temp.left, year); searchByYear(temp.right, year); } }
当某个节点的年份匹配时,你只执行了打印操作,然后直接结束了当前方法的执行——完全没去检查这个节点的左、右子树里有没有同样年份的影片!而你也说了这棵二叉搜索树不是按年份排序的,所以匹配节点的子树里完全可能存在符合条件的影片,这就导致了部分结果被遗漏。
修正后的代码
要解决这个问题,你需要不管当前节点是否匹配,都要递归遍历它的左右子树,确保整棵树的每个节点都被检查到。修改后的代码如下:
private void searchByYear(BTNode root, int year) { if(root == null) return; // 先检查当前节点是否匹配,匹配就打印 if(root.data.titleYear == year){ System.out.println(root.data.title); } // 不管当前节点是否匹配,都要遍历左右子树 searchByYear(root.left, year); searchByYear(root.right, year); }
我还帮你去掉了多余的temp变量,直接用root参数就可以了,代码更简洁。
逻辑说明
这个修正后的逻辑是前序遍历(先处理当前节点,再遍历左子树,最后遍历右子树),当然你也可以换成中序或后序遍历,只要保证每个节点都被访问到就行——因为我们需要对整棵树进行全量遍历,遍历顺序不影响最终的打印结果,只要所有符合条件的节点都被检查到。
因为你的树不是按年份排序的,所以没办法利用二叉搜索树的特性进行剪枝,必须遍历每一个节点才能确保找到所有匹配年份的影片。
内容的提问来源于stack exchange,提问作者Jordan Ranen
相关产品推荐
相关产品推荐

