二叉树使用前序、中序、后续查找指定节点(详解)
在使用前序、中序、后续遍历完节点后,我们有的时候也需要来查找指定的节点,例如查找编号为n的节点所代表的名字。
前序查找思路:
(1)先判断当前节点的no是否等于要查找的
(2)如果相等,则返回当前节点
(3)如果不相等,则判断当前节点的左子节点是否为空,如果不为空,则递归前序查找
(4)如果左递归前序查找,找到节点则返回,否则继续判断,当前节点的右子节点是否为空,如果不为空,则继续递归前序查找
(5)如果未找到,则返回null
//如果找到就返回该Node,没有找到就返回null
public HeroNode preOrderSearch(int no) {
System.out.println("进入前序遍历");
//比较当前结点是不是
if (this.no == no) {
return this;
}
HeroNode resNode = null;
if (this.left != null) {
resNode = this.left.preOrderSearch(no);
}
if (resNode != null) { //说明在左子树找到
return resNode;
}
if (this.right != null) {
resNode = this.right.preOrderSearch(no);
}
return resNode;
}
中序查找思路:
(1)先判断当前节点的左子节点是否为空,如果不为空,则递归前序查找
(2)如果左递归前序查找,找到节点则返回,否则,判断当前节点的no是否等于要查找的
(3)如果相等,则返回当前节点
(4)如果不相等,则判断当前节点的右子节点是否为空,如果不为空,则递归前序查找
(5)如果未找到,则返回null
public HeroNode infixOrderSearch(int no) {
HeroNode resNode = null;
if (this.left != null) {
resNode = this.left.infixOrderSearch(no);
}
if (resNode != null) {
return resNode;
}
System.out.println("进入中序遍历");
if (this.no == no) {
return this;
}
if (this.right != null) {
resNode = this.right.infixOrderSearch(no);
}
return resNode;
}
后续查找思路:
(1)先判断当前节点的左子节点是否为空,如果不为空,则递归前序查找
(2)如果左递归前序查找,找到节点则返回,否则,判断当前节点的右子节点是否为空,如果不为空,则递归前序查找
(3)如果不相等,判断当前节点的no是否等于要查找的
(4)如果相等,则返回当前节点
(5)如果未找到,则返回null
//后序遍历查找
public HeroNode postOrderSearch(int no) {
HeroNode resNode = null;
if (this.left != null) {
resNode = this.left.postOrderSearch(no);
}
if (resNode != null) {
return resNode;
}
if (this.right != null) {
resNode = this.right.postOrderSearch(no);
}
if (resNode != null) {
return resNode;
}
System.out.println("进入后序遍历");
if (this.no == no) {
return this;
}
return resNode;
}
用上一篇文章的例子,我们假如查询no为5的节点,运行结果如图:
如果我们想看一下前序查找中遍历了多少次,可以在判断当前节点是否相等的前面加一条代码:
System.out.println("进入前序遍历");
//比较当前结点是不是
if (this.no == no) {
return this;
}
运行结果如图:
同样的,我们用中序查找和后序查找验证一下:
中序遍历三次。
后序遍历两次。
以上就是二叉树前序中序后序,遍历和查找的详细说明