二叉树的构建及各种遍历方式

树型结构是一种非常重要的非线性数据结构,在计算机领域应用广泛,本文以二叉树为例,详细介绍二叉树的构建及遍历方式,其中包含递归实现的先序遍历、中序遍历及后续遍历,以及非递归实现的深度优先遍历、广度优先遍历。

以下是Java代码实现:

package me.geed.algorithms;

import java.util.LinkedList;
import java.util.Queue;
import java.util.Stack;

public class BinaryTree {
	/**二叉树根节点*/
	private Node rootNode;
	
	/**
	 * 由整数数组构造二叉树
	 * @param array
	 */
	public BinaryTree(int[] array) {
		rootNode = createBinaryTreeNode(array, 0);
	}
		
	public class Node {
		private int value;
		private Node leftChild;
		private Node rightChild;
		
		public Node(int value) {
			this.value = value;
		}
	}
	
	/**
	 * 先序遍历二叉树--递归方式
	 * @param node
	 */
	public void preOrderTraverse(Node node) {
		if (node != null) {
			System.out.print(node.value + "  ");
			preOrderTraverse(node.leftChild);
			preOrderTraverse(node.rightChild);
		}
	}
	
	/**
	 * 中序遍历二叉树--递归方式
	 * @param node
	 */
	public void midOrderTraverse(Node node) {
		if (node != null) {			
			midOrderTraverse(node.leftChild);
			System.out.print(node.value + "  ");
			midOrderTraverse(node.rightChild);
		}
	}
	
	/**
	 * 后序遍历二叉树--递归方式
	 * @param node
	 */
	public void postOrderTraverse(Node node) {
		if (node != null) {			
			postOrderTraverse(node.leftChild);			
			postOrderTraverse(node.rightChild);
			System.out.print(node.value + "  ");
		}
	}
	
	/**
	 * 深度优先遍历(跟先序遍历是一样的)--非递归实现
	 * 借助栈先进后出的特点,示例仅演示原理,如果追求效率可以使用ArrayDeque
	 */
	public void depthOrderTraverse(){
		if (rootNode == null) {
			return;
		}
		Stack<Node> stack = new Stack<Node>();
		stack.push(rootNode);
		while (!stack.isEmpty()) {
			Node node = stack.pop();
			System.out.print(node.value + "  ");
			if (node.rightChild != null) {
				stack.push(node.rightChild);
			}
			if (node.leftChild != null) {
				stack.push(node.leftChild);
			}
		}
	}
	
	/**
	 * 广度优先遍历(跟层序遍历是一样的)--非递归实现
	 * 借助链表尾部进、头部出的特点,如追求效率可使用ArrayDeque
	 */
	public void levelOrderTraverse() {
		if (rootNode == null) {
			return;
		}
		Queue<Node> queue = new LinkedList<Node>();
		queue.add(rootNode);
		while (!queue.isEmpty()) {
			Node node = queue.remove();
			System.out.print(node.value + "  ");
			if (node.leftChild != null) {
				queue.add(node.leftChild);
			}
			if (node.rightChild != null) {
				queue.add(node.rightChild);
			}
		}
	}
	
	/**
	 * 创建二叉树的节点
	 * @param array
	 * @param index
	 * @return
	 */
	public Node createBinaryTreeNode(int[] array, int index) {
		if (index < array.length) {
			int value = array[index];
			if (value != 0) {
				Node node = new Node(value);
				node.leftChild = createBinaryTreeNode(array, index * 2 + 1);
				node.rightChild = createBinaryTreeNode(array, index * 2 + 2);
				return node;
			}
		}
		return null;		
	}

	/**
	 * 入口函數
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int[] array = {1, 3, 6, 8, 12, 7, 29, 47, 35, 0, 99, 0, 0, 68, 0};
		BinaryTree bTree = new BinaryTree(array);
		/**  
		 * 由以上数组生成的二叉树结构如下,0表示空节点
		 * 
	     *                  1 
	     *                /   \ 
	     *               3     6 
	     *              / \   / \ 
	     *             8  12 7  29 
	     *            / \   \   / 
	     *           47 35  99 68  
	     */  
		System.out.println("先序遍历二叉树");
		bTree.preOrderTraverse(bTree.rootNode);
		
		System.out.println("\n中序遍历二叉树");
		bTree.midOrderTraverse(bTree.rootNode);
		
		System.out.println("\n后序遍历二叉树");
		bTree.postOrderTraverse(bTree.rootNode);
		
		System.out.println("\n深度优先遍历二叉树");
		bTree.depthOrderTraverse();
		
		System.out.println("\n广度优先遍历二叉树");
		bTree.levelOrderTraverse();

	}

}
以上代码中的注释已经描述的比较清楚,程序运行结果如下:

先序遍历二叉树
1  3  8  47  35  12  99  6  7  29  68  
中序遍历二叉树
47  8  35  3  12  99  1  7  6  68  29  
后序遍历二叉树
47  35  8  99  12  3  7  68  29  6  1  
深度优先遍历二叉树
1  3  8  47  35  12  99  6  7  29  68  
广度优先遍历二叉树
1  3  6  8  12  7  29  47  35  99  68  




你可能感兴趣的:(二叉树,二叉树遍历,广度优先遍历,深度优先遍历,非递归实现)