文章目录
二叉树的四种遍历方式前序遍历(Preorder Traversal)中序遍历(Inorder Traversal)后序遍历(Postorder Traversal)层序遍历(Level Order Traversal)二叉树的四种遍历方式
相信大家能够看到二叉树的遍历就已经对二叉树本身有了足够的了解,这里就不进行过多的赘述了,我们直接进入正题。我们知道线性数据结构的遍历一般就是前序遍历和后序遍历,而二叉树的遍历常见的有三种:前序遍历、中序遍历、后序遍历(注意:前中后是针对根节点而言的),有时候也会提到层序遍历。
前序遍历(Preorder Traversal)
访问顺序:根节点——>前序遍历左子树——>前序遍历右子树
代码实现
/*** 通过递归实现* 对树进行前序遍历* @param node 需要进行前序遍历的树的根节点,比如首先是大树的根节点,再是左子树的根节点,一直调用*/public void preOrderTraversal(Node<E> node){if (node == null) {return;}System.out.println(node.element);//输出节点的值preOrderTraversal(node.left);preOrderTraversal(node.right);}
中序遍历(Inorder Traversal)
访问顺序:中序遍历左子树——>根节点——>中序遍历右子树
中序遍历二叉搜索树的结果是有序的,一般为升序
代码实现
/*** 递归实现对二叉树的中序遍历* @param node 传入一棵树的根节点,先中序遍历一棵树的左边输出值,再输出根节点的值,最后遍历右边*/public void inOrderTraversal(Node<E> node) {if (node == null) {return;}inOrderTraversal(node.left);System.out.println(node.element);inOrderTraversal(node.right);}
后序遍历(Postorder Traversal)
访问顺序:后序遍历左子树——>后序遍历右子树——>根节点
代码实现
/*** 递归实现后序遍历* @param node 传入一颗树的根节点* 大家可以想象这个递归过程,当我们递归到最左边的叶子节点时,左右子树都为空时会输出叶子节点值,重复如此*/private void potsOrderTraversal(Node<E> node) {if (node == null) {return;}potsOrderTraversal(node.left);potsOrderTraversal(node.right);System.out.println(node.element);}
层序遍历(Level Order Traversal)
访问顺序:从根节点开始,一层一层向下访问。
代码实现
/*** 实现树的层序遍历** @param node 传入一颗树的根节点,使用队列来完成* 1.将根节点放入队* 2.将队头节点出队访问,将队头节点的左节点入队,再将右节点入队(将这一步循环操作,直到队列为空)*/public void levelOrderTraversal(Node<E> node) {if (node == null) {//若根节点为空直接返回return;}Queue<Node<E>> queue = new LinkedList<>();queue.offer(node);//将根节点入队while (!queue.isEmpty()) {//队列不为空就一直循环Node<E> firstNode = queue.poll();//将队首元素出队System.out.println(firstNode.element);//访问if (firstNode.left != null) {//在队首元素出队时将其左节点入队queue.offer(firstNode.left);}if (firstNode.right != null) {//在队首元素出队时将其右节点入队queue.offer(firstNode.right);}}}