众所周知,二叉树主要有前序遍历,中序遍历以及后序遍历这三种主要的方式,那我们就先来解释下这种遍历的含义:
1、前序遍历:若二叉树为空,则空操作返回,否则先访问根结点,然后前序遍历左子树,再前序遍历右子树。
2、中序遍历:若二叉树为空,则空操作返回,否则从根结点开始(注意并不是先访问根结点),中序遍历根结点的左子树,然后访问根结点
3、后序遍历:若二叉树为空,则空操作返回,否则从左到右先叶子后结点的方式遍历访问左右子树,最后访问根结点。
树结构的思想主要就是递归,因为二叉树从根结点出发,一般有着左子树和右子树,左子树和右子树终究还是树啊,你看是不是又回到树了,这就是一个递归嘛。那么在对树进行相关操作的时候,我们当然要好好利用这个递归的特性。
前置准备:
树结构构造代码
/**
* 树结构
*/
public class MyTree {
private MyNode root;
public MyNode getRoot() {
return root;
}
public void setRoot(MyNode root) {
this.root = root;
}
}
MyNode结点的构造代码:
public class MyNode {
// 左子节点
private MyNode lNode;
// 数据域
private String data;
// 右子节点
private MyNode rNode;
public MyNode(MyNode lNode, String data, MyNode rNode) {
this.lNode = lNode;
this.data = data;
this.rNode = rNode;
}
public MyNode() {
}
public MyNode getlNode() {
return lNode;
}
public void setlNode(MyNode lNode) {
this.lNode = lNode;
}
public String getData() {
return data;
}
public void setData(String data) {
this.data = data;
}
public MyNode getrNode() {
return rNode;
}
public void setrNode(MyNode rNode) {
this.rNode = rNode;
}
}
构造一个树结构:
MyTree tree = new MyTree();
MyNode cNode = new MyNode(null,"C",null);
MyNode eNode = new MyNode(null,"E",null);
MyNode fNode = new MyNode(null,"F",null);
MyNode bNode = new MyNode(cNode, "B", null);
MyNode dNode = new MyNode(eNode, "D", fNode);
MyNode aNode = new MyNode(bNode, "A", dNode);
tree.setRoot(aNode);
树结构如下:
对于上图中的树结构进行子树划分后如下图:
看图中用颜色标出来的结构,红色框中是A结点的左子树和右子树;蓝色框中的分别是结点B的左子树以及结点D的左子树和右子树;子树也是树,所以我们就可以使用递归遍历
1、前序遍历
先访问根结点,然后前序遍历左子树,再前序遍历右子树。
// 前序遍历
private static void frontSort(MyNode node) {
if (node == null) {return;}
System.out.println(node.getData());
// 遍历左子树
frontSort(node.getlNode());
// 遍历右子树
frontSort(node.getrNode());
}
2、中序遍历
从根结点开始(注意并不是先访问根结点),中序遍历根结点的左子树,然后访问根结点
// 中序遍历
private static void middleSort(MyNode node) {
if (node == null) {return;}
// 遍历左子树
middleSort(node.getlNode());
System.out.println(node.getData());
// 遍历右子树
middleSort(node.getrNode());
}
3、后序遍历
从左到右先叶子后结点的方式遍历访问左右子树,最后访问根结点
// 后序遍历
private static void postSort(MyNode node) {
if (node == null) {return;}
// 遍历左子树
postSort(node.getlNode());
// 遍历右子树
postSort(node.getrNode());
System.out.println(node.getData());
}