二叉树的基本遍历方式
数据结构:二叉树
1 二叉树的概念
二叉树(Binary tree)是树形结构的一个重要类型。许多实际问题抽象出来的数据结构往往是二叉树形式,即使是一般的树也能简单地转换为二叉树,而且二叉树的存储结构及其算法都较为简单,因此二叉树显得特别重要。二叉树特点是每个结点最多只能有两棵子树,且有左右之分。
二叉树是n个有限元素的集合,该集合或者为空、或者由一个称为根(root)的元素及两个不相交的、被分别称为左子树和右子树的二叉树组成,是有序树。当集合为空时,称该二叉树为空二叉树。在二叉树中,一个元素也称作一个结点 。
逻辑上,二叉树有五种形态。
1、空二叉树——如图(a) ;
2、只有一个根结点的二叉树——如图(b);
3、只有左子树——如图(c);
4、只有右子树——如图(d);
5、完全二叉树——如图(e)。
注意:尽管树和二叉树的概念之间有许多的类似,但它们是两个不同的数据结构。因为从定义来看,二叉树既不是只有两个子树的树,也不是最多只有两个子树的树。 树和二叉树最主要的区别是:二叉树中结点的子树要区分左子树和右字树,即使在结点只有一棵子树的情况下也要明确指出该子树是左子树还是右子树。
1.1 二叉树的Java实现
二叉树和链表类似,都是在内存中不连续存储,通过指针指向后序节点。因此,可以简单借鉴链表实现简单二叉树。
/**
* 一个二叉树的节点类的定义,该二叉树存储int型数字。
*/
public class TreeNode {
int value;
TreeNode left;
TreeNode right;
public TreeNode(int value) {
this.value = value;
}
@Override
public String toString() {
return "TreeNode{" +
"value=" + value +
", left=" + left +
", right=" + right +
'}';
}
}
我们初始化一个二叉树。
public class BinaryTreeDemo {
/**
* 初始化一个三层七节点的二叉树。
*
* @return 返回二叉树的根节点。
*/
public static TreeNode initialBinaryTree() {
TreeNode root = new TreeNode(10);
root.left = new TreeNode(6);
root.left.left = new TreeNode(4);
root.left.right = new TreeNode(8);
root.right = new TreeNode(14);
root.right.left = new TreeNode(12);
root.right.right = new TreeNode(16);
return root;
}
}
该二叉树如图所示
2 二叉树的遍历
遍历是对树的一种最基本的运算,所谓遍历二叉树,就是按一定的规则和顺序走遍二叉树的所有结点,使每一个结点都被访问一次,而且只被访问一次。由于二叉树是非线性结构,因此,树的遍历实质上是将二叉树的各个结点转换成为一个线性序列来表示。
我们假设有这么一个二叉树:
对于二叉树,有深度遍历和广度遍历两种方式,深度遍历有前序遍历、中序遍历、后序遍历三种,广度遍历一般指的是层序遍历。
二叉树的四种常规遍历方式: