树遍历思路(递归):
前序遍历:
- 先输出当前节点内容
- 若左节点存在,进行左递归
- 若右节点存在,进行右递归
中序遍历:
1.若左节点存在,进行左递归
2.输出当前节点内容
3.若右节点存在,进行右递归
后序遍历:
1.若左节点存在,进行左递归
2.若右节点存在,进行右递归
3.输出当前节点内容
代码实现:
//前序遍历
public void preOrder(){
//先输出当前节点
System.out.println(this);
//进行左节点是否存在的判断
if (this.left != null){
//左递归
this.left.preOrder();
}
//进行右节点是否存在的判断
if (this.right != null){
//右递归
this.right.preOrder();
}
}
//中序遍历
public void midOrder(){
//先进行左节点是否存在的判断,存在则进行递归
if (this.left != null){
//左递归
this.left.midOrder();
}
//输出当前节点
System.out.println(this);
//进行右节点是否存在的判断,存在则进行递归
if (this.right != null){
//右递归
this.right.midOrder();
}
}
//中序遍历
public void postOrder(){
//先进行左节点是否存在的判断,存在则进行递归
if (this.left != null){
//左递归
this.left.postOrder();
}
//进行右节点是否存在的判断,存在则进行递归
if (this.right != null){
//右递归
this.right.postOrder();
}
//输出当前节点
System.out.println(this);
}
-------------------------------------------------------------------------------------------------------------------------------
在此基础上,树查找的思路与其相似
下面举例前序查找
前序查找:
1.先判断当前节点是否为所需节点,是则直接返回该节点
2.若左节点存在,进行左递归,用临时变量temp存贮左递归返回的值
3.判断temp是否为null,若不为null,则返回temp
4.若temp为null,则进行右节点是否存在判断,进行右递归,并用temp存贮右递归返回的值
5.最后返回temp
注:第二步不能直接return左递归返回的值。若直接return,当左递归返回值为null时就会直接return null。
(中序和后序与其类似,无非是判断当前节点的位置不同)
代码实现:
//前序查找
public Node preSearch(Node n){
//先判断当前节点
if(this == n){
return this;
}
Node temp = null; //临时变量
//进行左节点是否存在的判断
if (this.left != null){
//左递归
temp = this.left.preSearch(n);
}
//对temp进行判断
if (temp != null){
return temp;
}
//进行右节点是否存在的判断
if (this.right != null){
//右递归
temp = this.right.preSearch(n);
}
//最后
return temp;
}