二叉搜索树递归查找非键值(人员所属国家)的实现问题
问题原因
你的countryExists方法出现错误的核心原因是递归逻辑存在提前截断的问题,同时缺失边界情况的返回值:
- 当前节点国家不匹配时,只要右子节点不为空,你就直接返回了右子树的查询结果,无论右子树是否找到目标国家,左子树的查询逻辑都不会执行,导致左子树的所有节点被漏查。
- 如果当前节点国家不匹配,且左右子节点均为空,方法没有明确返回
false,存在逻辑漏洞。
修复方案
正确的逻辑为:当前节点匹配直接返回true,否则只要任意一棵子树查询到匹配结果就返回true,所有分支都未查询到匹配时返回false,修复后的代码如下:
public boolean countryExists(String country){ // 校验当前节点是否匹配 if (this.person.getCountry().equals(country)) { return true; } // 校验右子树是否存在匹配 if (right != null && right.countryExists(country)) { return true; } // 校验左子树是否存在匹配 if (left != null && left.countryExists(country)) { return true; } // 所有节点均不匹配 return false; }
你对遍历顺序的理解是正确的,是否存在的判断结果和遍历顺序无关,只要覆盖所有节点即可,你也可以调整左右子树的查询顺序,最终返回结果不会发生变化。
可选优化:如果入参country可能为null,可以将equals判断替换为Objects.equals(this.person.getCountry(), country),避免空指针异常。
内容的提问来源于stack exchange,提问作者Martin
相关产品推荐
相关产品推荐

