二叉树查找算法(前、中、后查找)
1.前序查找思路
- 先判断当前结点的no是否等于要查找的no
- 如果no相等,则返回该结点
- 如果no不相等,则判断当前结点的左子结点是否为空,如果不为空,则递归前序查找
- 如果左递归前序查找到结点,则返回
- 否则继续判断,当前结点的右子结点是否为空,如果不为空,则继续递归前序查找
2.中序查找思路
- 判断当前结点的左子结点是否存在,如果存在,则递归中序查找
- 如果找到,则返回当前结点
- 如果没有找到,继续递归中序查找,如果找到,则返回该结点,否则返回null
3.后序查找思路
- 判断当前结点的左子结点是否为空,如果不为空,则递归后序查找
- 如果找到,就返回,如果没有找到就判断当前结点的右子结点是否存在,如果不为空,则右递归进行后序查找,如果找到,则返回结点
- 前面两步都没有找到结点,就和当前结点比较,如果相等就返回,否则返回null
4.代码实现
4.1在HeroNode中编写如下方法
//前序查找
/**
*
* @param no 查找的no
* @return 如果找到就返回该结点,没有找到就返回null
*/
public HeroNode preOrderFind(int no){
System.out.println("进入前序遍历");
//判断当前结点是不是要查找的,如果是则返回
if (this.no == no) {
return this;
}
//1.判断左子结点是否为空,如果不为空,则递归前序查找
//2.递归前序查找,找到之后返回
HeroNode resHeroNode = null;//用于保存查找的结果结点
if (this.left != null) {
resHeroNode = this.left.preOrderFind(no);
}
if (resHeroNode != null) {
return resHeroNode;//说明在左子树中找到
}
//1.左递归之后没有找到,继续判断右子树
//2.当前结点的右子结点不为空,则继续右递归前序查找
if (this.right != null) {
resHeroNode = this.right.preOrderFind(no);
}
return resHeroNode;//说明在右子树中找到,右子树也没有找到的话,返回初始值null
}
//中序查找
public HeroNode infixOrderFind(int no){
//判断当前结点的左子结点是否为空,如果不为空,则递归中序查找
HeroNode resNode = null;
if (this.left != null) {
resNode = this.left.infixOrderFind(no);
}
if (resNode != null) {
return resNode;//说明找到
}
System.out.println("进入中序遍历");
//如果找到,则返回当前结点
if (this.no == no) {
return this;
}
// 否则继续进行右递归中序查找
if (this.right != null) {
resNode = this.right.infixOrderFind(no);
}
return resNode;
}
//后序遍历查找
public HeroNode postOrderFind(int no){
// 如果当前结点的左子结点不为空,则递归后序查找
HeroNode resNode = null;
if (this.left != null) {
resNode = this.left.postOrderFind(no);
}
if (resNode != null) {
return resNode;
}
// 左子树没有找到,则判断右子树是否找到,没有找到就继续递归后序查找
if (this.right != null) {
resNode = this.right.postOrderFind(no);
}
if (resNode != null) {
return resNode;
}
System.out.println("进入后序遍历查找");
// 如果左右子树都没有找到,就比较当前结点是不是
if (this.no == no) {
return this;
}
return resNode;
}
4.2在BinaryTree中编写如下方法
//前序遍历查找
public HeroNode preOrderFind(int no){
if (root != null) {
return root.preOrderFind(no);
}else {
return null;
}
}
//中序遍历查找
public HeroNode infixOrderFind(int no){
if (root != null) {
return root.infixOrderFind(no);
} else {
return null;
}
}
// 后序遍历查找
public HeroNode postOrderFind(int no){
if (root != null) {
return root.postOrderFind(no);
} else {
return null;
}
}
4.3在main方法中编写测试代码
System.out.println("zhong序查找方式");
HeroNode resNode = binaryTree.infixOrderFind(5);
if (resNode != null) {
System.out.printf("找到结点,信息为no=%d,name=%s",resNode.getNo(),resNode.getName());
}else {
System.out.println("没有找到需要的结点");
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律