1 前言
所谓遍历(Traversal)是指沿着某条搜索路线,依次对树中每个结点均做一次且仅做一次访问。访问结点所做的操作依赖于具体的应用问 题。 遍历是二叉树上最重要的运算之一,是二叉树上进行其它运算之基础。
由于二叉树的递归遍历相对与非递归遍历而言,形式统一,代码简单,比较容易理解。所以,本文先用Java实现二叉树的递归遍历方法。下篇博文介绍非递归遍历的实现。
2 二叉树的递归遍历
2.1 先序遍历
2.2 中序遍历
2.3 后序遍历
3 Java代码实现
3.1 建立二叉树结点类
package Binary_Tree_Study;
/**
* Created by Administrator on 2018/5/19.
*/
public class BinaryTreeNode {
private int data;//结点的数据
private BinaryTreeNode left;//指向左孩子结点
private BinaryTreeNode right;//指向左孩子结点
public BinaryTreeNode(int data) {
this.data = data;
this.left = null;
this.right =null;
}
public int getData() {
return data;
}
public void setData(int data) {
this.data = data;
}
public BinaryTreeNode getLeft() {
return left;
}
public void setLeft(BinaryTreeNode left) {
this.left = left;
}
public BinaryTreeNode getRight() {
return right;
}
public void setRight(BinaryTreeNode right) {
this.right = right;
}
}
3.2 二叉树的递归遍历实现
package Binary_Tree_Study;
/**
* Created by Administrator on 2018/5/19.
*/
public class BinaryTree {
private BinaryTreeNode root;//二叉树根结点
public BinaryTree() {
this.root = null;
}
/* 建立二叉树:
1
/ \
2 3
/ \ /
4 5 6
*/
public BinaryTreeNode createBinaryTree() {
root = new BinaryTreeNode(1);
root.setLeft(new BinaryTreeNode(2));
root.setRight(new BinaryTreeNode(3));
root.getLeft().setLeft(new BinaryTreeNode(4));
root.getLeft().setRight(new BinaryTreeNode(5));
root.getRight().setLeft(new BinaryTreeNode(6));
return root;
}
//先序遍历:递归方法
public void PreOrderRecursive(BinaryTreeNode root) {
if(root == null)
return;
System.out.print(root.getData() + " ");//访问根结点
PreOrderRecursive(root.getLeft());//先序遍历其左子树
PreOrderRecursive(root.getRight());//先序遍历其右子树
}
//中序遍历:递归方法
public void InOrderRecursive(BinaryTreeNode root) {
if(root == null)
return;
InOrderRecursive(root.getLeft());//中序遍历其左子树
System.out.print(root.getData() + " ");//访问根结点
InOrderRecursive(root.getRight());//中序遍历其右子树
}
//后序遍历:递归方法
public void PostOrderRecursive(BinaryTreeNode root) {
if(root == null)
return;
PostOrderRecursive(root.getLeft());//中序遍历其左子树
PostOrderRecursive(root.getRight());//中序遍历其右子树
System.out.print(root.getData() + " ");//访问根结点
}
}
3.3 测试
package Binary_Tree_Study;
/**
* Created by Administrator on 2018/5/19.
*/
public class BinaryTreeTest {
public static void main(String[] args) {
BinaryTree tree = new BinaryTree();
BinaryTreeNode root = tree.createBinaryTree();
System.out.println("先序遍历为:");
tree.PreOrderRecursive(root);
System.out.println("\n中序遍历为:");
tree.InOrderRecursive(root);
System.out.println("\n后序遍历为:");
tree.PostOrderRecursive(root);
}
}
4 总结
先序、中序和后序遍历过程:遍历过程中经过结点的路线一样,只是访问各结点的时机不同。在搜索路线中,若访问结点均是第一次经过结点时进行的,则是前序遍历;若访问结点均是在第二次(或第三次)经过结点时进行的,则是中序遍历(或后序遍历)。只要将搜索路线上所有在第一次、第二次和第三次经过的结点分别列表,即可分别得到该二叉树的前序序列、中序序列和后序序列。
5 参考资料
[2] Tree Traversals (Inorder, Preorder and Postorder)
[3] 二叉树遍历---百度百科