思路和代码实现
利用前序遍历查找思路
- 先确定当前节点是否是要查找的target
- 如果是,则返回当前节点
- 如果不是,则判断当前节点的左子节点是否为空,如果不为空则递归前序遍历查找
- 如果左递归前序查找找到目标节点则返回,如果左递归没有找到,则判断右子节点是否为空,如果不为空,则继续向右遍历查找,最后返回结果。
public NodeNN preOrderSearch(int no){
System.out.println("前序遍历的次数");
if(this.no==no){
return this;
}
NodeNN result=null;
if (this.left!=null){
result=this.left.preOrderSearch(no);
}
if(result!=null){
return result;
}
if(this.right!=null){
result=this.right.preOrderSearch(no);
}
return result;
}
利用中序遍历查找思路
- 先判断左子节点是否为空,如果不为空则递归中序查找,
- 如果找到则返回,如果没有找到则和按当前节点比较,如果是目标,则返回当前的节点,如果不是,则继续进行右递归的中序查找
- 如果右递归中序查找找到了则返回,否则返回null
public NodeNN inOrderSearch(int no){
NodeNN result=null;
if(this.left!=null){
result=this.left.inOrderSearch(no);
}
if(result!=null){
return result;
}
System.out.println("中序遍历的次数");
if(this.no==no){
return this;
}
if(this.right!=null){
result=this.right.inOrderSearch(no);
}
return result;
}
利用后序遍历查找思路
- 先判断左子节是否为空,如果不为空则左边进行递归后序遍历查找
- 左边没有,则判断右边节点是否为空,如果不为空,则对右边进行遍历查找
- 右边如果没有找到则判断当前节点是否是目标节点
public NodeNN postOrderSearch(int no){
NodeNN result=null;
if(this.left!=null){
result=this.left.postOrderSearch(no);
}
if(result!=null){
return result;
}
if(this.right!=null){
result=this.right.postOrderSearch(no);
}
if(result!=null){
return result;
}
System.out.println("后序遍历的次数");
if(this.no==no){
return this;
}
return result;
}
测试代码
package com.njupt.binaryTree;
public class Search {
public static void main(String[] args) {
Binary binary = new Binary();
NodeNN node1=new NodeNN(1,"吴吴");
NodeNN node2=new NodeNN(2,"亦亦");
NodeNN node3=new NodeNN(3,"凡凡");
NodeNN node4=new NodeNN(4,"签签");
NodeNN node5=new NodeNN(5,"word");
NodeNN node6=new NodeNN(6,"very big");
node1.left=node2;
node1.right=node4;
node2.left=node3;
node4.left=node5;
node4.right=node6;
binary.root=node1;
System.out.println("前序遍历:");
System.out.println(binary.pre(3));
System.out.println("中序遍历:");
System.out.println(binary.in(3));
System.out.println("后序遍历:");
System.out.println(binary.post(3));
}
}
class Binary{
public NodeNN root;
public NodeNN pre(int no){
if(root!=null){
return root.preOrderSearch(no);
}else{
return null;
}
}
public NodeNN in(int no){
if(root!=null){
return root.inOrderSearch(no);
}else{
return null;
}
}
public NodeNN post(int no){
if(root!=null){
return root.postOrderSearch(no);
}else{
return null;
}
}
}
class NodeNN{
public int no;
public String name;
public NodeNN left;
public NodeNN right;
public NodeNN(int no, String name) {
this.no = no;
this.name = name;
}
@Override
public String toString() {
return "Node1{" +
"no=" + no +
", name='" + name + '\'' +
'}';
}
public NodeNN preOrderSearch(int no){
System.out.println("前序遍历的次数");
if(this.no==no){
return this;
}
NodeNN result=null;
if (this.left!=null){
result=this.left.preOrderSearch(no);
}
if(result!=null){
return result;
}
if(this.right!=null){
result=this.right.preOrderSearch(no);
}
return result;
}
public NodeNN inOrderSearch(int no){
NodeNN result=null;
if(this.left!=null){
result=this.left.inOrderSearch(no);
}
if(result!=null){
return result;
}
System.out.println("中序遍历的次数");
if(this.no==no){
return this;
}
if(this.right!=null){
result=this.right.inOrderSearch(no);
}
return result;
}
public NodeNN postOrderSearch(int no){
NodeNN result=null;
if(this.left!=null){
result=this.left.postOrderSearch(no);
}
if(result!=null){
return result;
}
if(this.right!=null){
result=this.right.postOrderSearch(no);
}
if(result!=null){
return result;
}
System.out.println("后序遍历的次数");
if(this.no==no){
return this;
}
return result;
}
}
结果:
前序遍历:
前序遍历的次数
前序遍历的次数
前序遍历的次数
Node1{no=3, name='凡凡'}
中序遍历:
中序遍历的次数
Node1{no=3, name='凡凡'}
后序遍历:
后序遍历的次数
Node1{no=3, name='凡凡'}
Process finished with exit code 0
|