树的三种遍历
一棵树的三种遍历方式:先序遍历,中序遍历,后序遍历。
前中后三种顺序其实指的是根的顺序。
先序遍历:根节点、左子树、右子树
中序遍历:左子树、根节点、右子树
后序遍历:左子树、右子树、根节点
所以就是说先中后的顺序都是指根节点,除了根节点之外都是先左子树后右子树
举个例子:
遍历结果:
前序:FCADBEHGM
中序:ACBDFHEMG
后序:ABDCHMGEF
代码实现:
树结构构造代码:
/**
* 树结构
*/
public class MyTree {
private MyNode root;
public MyNode getRoot() {
return root;
}
public void setRoot(MyNode root) {
this.root = root;
}
}
树结点的构造代码:
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;
}
}
构造一个树结构:
public static void main(String[] args) {
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);
}
树结构如下:
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());
}