一:概述
深度优先遍历是在一个方向上“一头扎到底”,广度优先遍历则是与其相反的:在各个方向上各走出1步,再在各个方向上走出第2步、第3步.....一直到各个方向全部走完。听起来有些抽象,下面是通过二叉树的层序遍历,来看看广度优先遍历具体过程。
层序遍历,就是二叉树按照从根节点到叶子节点的层次关系,一层一层横向遍历各个节点。
如下图所示:
上图就是一个二叉树的层序遍历,每个节点左侧的序号代表该节点的输出顺序。可是,二叉树同一层次的节点之间是没有直接联系的,下面通过数据结构队列来讲解关于它的遍历。
二 广度遍历具体过程
<1>根节点1进入队列。
<2>节点1出队,输出节点1,并得到节点1的左孩子节点2、右孩子节点3.让节点2和节点3入队。
<3>节点2出队,输出节点2,并得到节点2的左孩子节点4、右孩子节点5.让节点4和节点5入队。
<4>节点3出队,输出节点3,并得到节点3的右孩子节点6.让节点6入队。
<5>节点4出队,输出节点4,由于节点4没有孩子节点,所以没有新节点入队。
<6>节点5出队,输出节点5,由于节点5同样没有孩子节点,所以没有新节点入队。
<7>节点6出队,输出节点6,节点6没有孩子节点,没有新节点入队。
到这一步,所有的节点都已经遍历输出完毕。
下面二叉树层序遍历的代码实现:
public static void preOrderTraveralWithStack(TreeNode root) {
Stack<TreeNode> stack = new Stack<TreeNode>();
TreeNode treeNode = root;
while(treeNode != null || !stack.isEmpty()) {
//迭代访问节点的左孩子,并入栈
while (treeNode != null) {
System.out.println(treeNode.data);
stack.push(treeNode);
treeNode = treeNode.leftChild;
}
// 如果节点没有左孩子,则弹出栈顶节点,访问节点右孩子
if(!stack.isEmpty()) {
treeNode = stack.pop();
treeNode = treeNode.rightChild;
}
}
}