在數據結構中,二叉樹是樹中我們見得最多的,二叉查找樹可以加速我們查找的效率,那么輸出一個二叉樹也變得尤為重要了。
二叉樹的遍歷方法分為四種,分別為前序遍歷、中序遍歷、后序、層序遍歷。下圖即為一個二叉樹。
- 前序遍歷:先遍歷根結點,然后遍歷左子樹,最后遍歷右子樹。
結果為:4 2 1 3 6 5 7 8 10 - 中序遍歷:先遍歷左子樹,然后遍歷根結點,最后遍歷右子樹。
結果為:1 2 3 4 5 6 7 8 10 - 后序遍歷:先遍歷左子樹,然后遍歷右子樹,最后遍歷根節點。
結果為:1 3 2 5 10 8 7 6 4 - 層序遍歷:逐層遍歷。
結果為:4 2 6 1 3 5 7 8 10
按照上面的規則,就可以很快地對一顆二叉樹進行遍歷,並且快速寫出結果,下面我附上我使用遞歸的方法對二叉樹實施四種遍歷的Java代碼。
public class Tree<AnyType extends Comparable<? super AnyType>>
{
private static class BinaryNode<AnyType>
{
BinaryNode(AnyType theElement)
{
this(theElement, null, null);
}
BinaryNode(AnyType theElement, BinaryNode<AnyType> lt, BinaryNode<AnyType> rt)
{
element = theElement;
left = lt;
right = rt;
}
AnyType element;
BinaryNode<AnyType> left;
BinaryNode<AnyType> right;
}
private BinaryNode<AnyType> root;
public void insert(AnyType x)
{
root = insert(x, root);
}
private BinaryNode<AnyType> insert(AnyType x, BinaryNode<AnyType> t)
{
if(t == null)
{
return new BinaryNode<>(x, null, null);
}
int compareResult = x.compareTo(t.element);
if(compareResult < 0)
{
t.left = insert(x, t.left);
}
else if(compareResult > 0)
{
t.right = insert(x, t.right);
}
else
{
;
}
return t;
}
/**
* 前序遍歷
*/
public void preOrder(BinaryNode<AnyType> Node)
{
if (Node != null)
{
System.out.print(Node.element + " ");
preOrder(Node.left);
preOrder(Node.right);
}
}
/**
* 中序遍歷
*/
public void midOrder(BinaryNode<AnyType> Node)
{
if (Node != null)
{
midOrder(Node.left);
System.out.print(Node.element + " ");
midOrder(Node.right);
}
}
/**
* 后序遍歷
*/
public void posOrder(BinaryNode<AnyType> Node)
{
if (Node != null)
{
posOrder(Node.left);
posOrder(Node.right);
System.out.print(Node.element + " ");
}
}
/*
* 層序遍歷
* 遞歸
*/
public void levelOrder(BinaryNode<AnyType> Node) {
if (Node == null) {
return;
}
int depth = depth(Node);
for (int i = 1; i <= depth; i++) {
levelOrder(Node, i);
}
}
private void levelOrder(BinaryNode<AnyType> Node, int level) {
if (Node == null || level < 1) {
return;
}
if (level == 1) {
System.out.print(Node.element + " ");
return;
}
// 左子樹
levelOrder(Node.left, level - 1);
// 右子樹
levelOrder(Node.right, level - 1);
}
public int depth(BinaryNode<AnyType> Node) {
if (Node == null) {
return 0;
}
int l = depth(Node.left);
int r = depth(Node.right);
if (l > r) {
return l + 1;
} else {
return r + 1;
}
}
public static void main( String[] args )
{
int[] input = {4, 2, 6, 1, 3, 5, 7, 8, 10};
Tree<Integer> tree = new Tree<>();
for(int i = 0; i < input.length; i++)
{
tree.insert(input[i]);
}
System.out.print( "前序遍歷 :" );
tree.preOrder(tree.root);
System.out.print( "\n中序遍歷 :" );
tree.midOrder(tree.root);
System.out.print( "\n后序遍歷 :" );
tree.posOrder(tree.root);
System.out.print("\n遞歸層序遍歷:");
tree.levelOrder(tree.root);
}
}
以上就完成了對二叉樹的四種遍歷,但是這只是遞歸方法的遍歷,下次我再來用非遞歸的方法實現對二叉樹的遍歷。