二叉树:二叉树是一种树形结构,它的特点是一个结点至多有两棵子树,并且二叉树的子树有左右之分。
1. 二叉树的遍历
二叉树遍历有三种方式:先序遍历、中序遍历、后序遍历。
先序遍历:访问根节点、先序遍历左子树、先序遍历右子树。
中序遍历:中序遍历左子树、访问根节点、中序遍历右子树。
后序遍历:后续遍历左子树、后续遍历右子树、访问根节点。
先序遍历,访问根节点、先序遍历左子树、先序遍历右子树,如下图所示:
这样的一棵树,先序遍历结果:-+a*b-cd/ef;中序遍历结果:a+b*c-d-e/f;后序遍历结果:abcd-*+ef/-。
2. 代码实现
代码实现如下所示。
package tree;
/**
* 二叉树
*/
public class MyBinaryTree {
private char data; // 结点的数据域
private MyBinaryTree rightSubtree; // 右子树
private MyBinaryTree leftSubtree; // 左子树
public MyBinaryTree(char data) {
this.data = data;
this.leftSubtree = null;
this.rightSubtree = null;
}
public void makeRightSubtree(char data) {
this.rightSubtree = new MyBinaryTree(data);
}
public void makeLeftSubTree(char data) {
this.leftSubtree = new MyBinaryTree(data);
}
public void makeSubtree(char leftData, char rightData) {
this.leftSubtree = new MyBinaryTree(leftData);
this.rightSubtree = new MyBinaryTree(rightData);
}
// 中序遍历
public void inorderTraversal() {
if (this.leftSubtree != null) {
this.leftSubtree.inorderTraversal();
}
System.out.print("[" + this.data + "]");
if (this.rightSubtree != null) {
this.rightSubtree.inorderTraversal();
}
}
// 先序遍历
public void preOrderTraversal() {
System.out.print("[" + this.data + "]");
if (this.leftSubtree != null) {
this.leftSubtree.preOrderTraversal();
}
if (this.rightSubtree != null) {
this.rightSubtree.preOrderTraversal();
}
}
// 后序遍历
public void postOrderTraversal() {
if (this.leftSubtree != null) {
this.leftSubtree.postOrderTraversal();
}
if (this.rightSubtree != null) {
this.rightSubtree.postOrderTraversal();
}
System.out.print("[" + this.data + "]");
}
public MyBinaryTree getRightSubtree() {
return rightSubtree;
}
public MyBinaryTree getLeftSubtree() {
return leftSubtree;
}
public static void main(String[] args) {
MyBinaryTree root = new MyBinaryTree('-');
root.makeLeftSubTree('+');
root.makeRightSubtree('/');
root.getLeftSubtree().makeLeftSubTree('a');
root.getLeftSubtree().makeRightSubtree('*');
root.getRightSubtree().makeLeftSubTree('e');
root.getRightSubtree().makeRightSubtree('f');
root.getLeftSubtree().getRightSubtree().makeSubtree('b', '-');
root.getLeftSubtree().getRightSubtree().getRightSubtree().makeSubtree('c', 'd');
System.out.print("前序遍历:");
root.preOrderTraversal();
System.out.print("\n中序遍历:");
root.inorderTraversal();
System.out.print("\n后序遍历:");
root.postOrderTraversal();
}
}
测试数据,构建下图的二叉树:
MyBinaryTree root = new MyBinaryTree('-');
root.makeLeftSubTree('+');
root.makeRightSubtree('/');
root.getLeftSubtree().makeLeftSubTree('a');
root.getLeftSubtree().makeRightSubtree('*');
root.getRightSubtree().makeLeftSubTree('e');
root.getRightSubtree().makeRightSubtree('f');
root.getLeftSubtree().getRightSubtree().makeSubtree('b', '-');
root.getLeftSubtree().getRightSubtree().getRightSubtree().makeSubtree('c', 'd');
三种遍历方式进行遍历:
System.out.print("前序遍历:");
root.preOrderTraversal();
System.out.print("\n中序遍历:");
root.inorderTraversal();
System.out.print("\n后序遍历:");
root.postOrderTraversal();
运行截图如下所示:
参考文献
- 数据结构 - 严蔚敏、吴伟民 - 清华大学出版社