前序查找的思路分析
1.先判断当前节点是不是自己要找的
2.如果是,则返回当前节点
3.如果不是,则判断当前节点的左子节点是否为空,如果不为空,则递归前序查找
4.如果左递归前序查找,找到节点则返回,若未找到,则继续判断当前节点的右子节点是否为空,如果不为空,则继续递归前序查找
前序查找代码实现
//前序遍历查找
//如果找到返回Node,没找到返回null
public Node preOrderSearch(int no) {
//比较当前节点是不是
if(this.no==no) {
return this;
}
//判断当前节点的左子节点是否为空,如果不为空,则进行前序查找
//如果左递归前序查找,找到则返回
Node 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;
}
//前序遍历查找
public Node preOrderSearch(int no) {
if(root!=null) {
return root.preOrderSearch(no);
}else {
return null;
}
}
中序查找思路分析
1.判断当前节点的左子节点是否为空,如果不为空,则递归中序查找
2.如果找到则返回,如果没有找到,就和当前节点进行比较,如果是则返回当前节点,否则继续进行右递归的中序查找
3.如果右递归中序查找,找到就返回,否则就返回null
中序查找代码实现
//中序遍历查找
public Node infixOrderSearch(int no) {
//判断当前节点的左子节点是否为空,如果不为空,则递归中序查找
Node resNode=null;
if(this.left!=null) {
resNode=this.left.infixOrderSearch(no);
}
if(resNode!=null) {//说明找到
return resNode;
}
//如果找到,则返回,如果没有找到,就和当前节点比较,如果是则返回当前节点
if(this.no==no) {
return this;
}
//否则进行右递归的中序查找
if(this.right!=null) {
resNode=this.right.infixOrderSearch(no);
}
return resNode;
}
//编写中序遍历的方法
public void infixOrder() {
//递归左子树中序遍历
if(this.left!=null) {
this.left.infixOrder();
}
//输出父节点
System.out.println(this);
//递归右子树中序遍历
if(this.right!=null) {
this.right.infixOrder();
}
}
后序查找思路分析
1.判断当前节点的左子节点是否为空,如果不为空,则递归中序查找
2.如果找到就返回,如果没有找到,就判断当前节点的右子节点是否为空,rr颗不为空,则右递归进行后序查找,如果找到,就返回
3.和当前节点进行比较,如果是则返回,如果不是就返回null
后序查找代码实现
//后序遍历查找
public Node postOrderSearch(int no) {
//判断当前节点是否为空,如果不为空,则递归后续查找
Node 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;
}
if(this.no==no) {
return this;
}
return resNode;
}
//编写后序遍历的方法
public void postOrder() {
if(this.left!=null) {
this.left.postOrder();
}
if(this.right!=null) {
this.right.postOrder();
}
System.out.println(this);
}