当前位置:   article > 正文

二叉树的四种遍历方法(前序遍历、中序遍历、后序遍历、层序遍历)有图有真相!!!_前序遍历 中序遍历 后序遍历

前序遍历 中序遍历 后序遍历

二叉树的四种遍历方式

相信大家能够看到二叉树的遍历就已经对二叉树本身有了足够的了解,这里就不进行过多的赘述了,我们直接进入正题。我们知道线性数据结构的遍历一般就是前序遍历和后序遍历,而二叉树的遍历常见的有三种:前序遍历、中序遍历、后序遍历(注意:前中后是针对根节点而言的),有时候也会提到层序遍历。

前序遍历(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);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
中序遍历(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);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
后序遍历(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);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
层序遍历(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);
        }
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/625827
推荐阅读
相关标签
  

闽ICP备14008679号