程序员应知应会之一文读懂二叉树的四种遍历

开发 前端
我们可以看到,对于人类来讲最为简洁明了的层次算法,对于计算机编程来说,需要的代码量要大很多。原因在于对于人们来说直观的约束条件,如哪个节点在哪一层,对于计算机来说并不直观。

树是编程中的一种最为重要的数据结构了,应用范围很广。比如说人们常用的操作系统,如Windows和Linux,它们的文件管理系统都是树型结构的。而这其中二叉树又是应用最广的树,因此也是很多程序员入门时学习的主要数据结构。

从外表上来看,二叉树非常简单,每个节点延伸出两个子节点,一层一层地延续下去,像人们的祖谱一样,非常容易理解。

 

图片


二叉树相关的编程中,二叉树的遍历是最为常见的一种,对于普通人来说,如果想遍历上图的二叉树的话,很多人都会很直白地一层一层读下去,于是遍历出来的结果就是ABCDEFG。非常直观。

但是计算机的计算方式和人们的思维方式是不一样的,这种层次遍历对于人来说非常好理解,但是对于计算机来说,并不是很好理解。

所以为了更符合计算机的思考方式,研究人员提出了先序遍历、中序遍历、后序遍历三种算法。这三种算法都是如何遍历二叉树的呢?我们来看一下。

一、先序遍历

先序遍历(Pre-order),也叫前序遍历,按照根左右的顺序沿一定路径经过路径上所有的结点。在二叉树中,对每个节点都是,先根后左再右。也就是,根左右。具体实现方法如下:

public static void preOrder(BinTreeNode t) {
    if (null == t ) return;
    System.out.println(t.getData());
    preOrder(t.getlChild());
    preOrder (t.getrChild());
}

对于上图的二叉树,遍历结果为,abdcegf。

二、中序遍历

中序遍历,也叫中根遍历、中序周游。中序遍历首先遍历左子树,然后访问根结点,最后遍历右子树。也就是,左根右。具体实现方法如下:

public static void inOrder(BinTreeNode t) {
    if (null == t ) return;
    inOrder(t.getlChild());
    System.out.println(t.getData());
    inOrder (t.getrChild());
}

对于上图的二叉树,遍历结果为:dbagefc。

三、后序遍历

后序遍历(LRD)也叫做后根遍历、后序周游。后序遍历首先遍历左子树,然后遍历右子树,最后访问要节点。也就是,左右根。具体实现方法如下:

public static void postOrder(BinTreeNode t) {
    if (null == t ) return;
    postOrder(t.getlChild());
    postOrder (t.getrChild());
    System.out.println(t.getData());
}

对于上图的二叉树,遍历结果为:dbgefca。

可以看到,上面的三种算法中,区别就是在于打印节点数据(应用节点数据域)的代码位置不一样而已。对于计算机来说,使用递归算法,非常简洁明了。

四、层次遍历

那么更符合人们习惯的层次遍历,计算机又需要怎样执行呢?我们可以看到,对于计算机而言,最大的问题在于它并不知道哪个节点属于哪一层,因此,我们需要使用代码记录,每个层次的节点信息。通常情况下,我们可以使用队列来实现。代码如下:

public static void levelOrder(BinTreeNode t) {
    Queue<BinTreeNode> q = new LinkedList<>();
    q.offer(t);
    while (!q.isEmpty()){
        int size = q.size();
        for (int i=0; i<size; i++) {
            BinTreeNode node = q.poll();
            System.out.println(node.getData());
            if (node.getlChild()!= null) q.offer(node.getlChild());
            if (node.getrChild() != null) q.offer(node.getrChild());
        }
    }
}

打印结果为:abcdefg。

我们可以看到,对于人类来讲最为简洁明了的层次算法,对于计算机编程来说,需要的代码量要大很多。原因在于对于人们来说直观的约束条件,如哪个节点在哪一层,对于计算机来说并不直观。因此,很多时候对于程序员来说,要按照计算机的思维来看问题,这样写出的代码才能更符合计算机的习惯。

责任编辑:武晓燕 来源: 活在信息时代
相关推荐

2020-04-27 07:05:58

二叉树左子树右子树

2022-10-12 23:25:17

二叉树父节点根节点

2021-05-06 17:46:30

二叉树数据结构

2023-05-06 07:24:22

程序员视频算法

2022-10-26 23:58:02

二叉树数组算法

2021-04-20 08:37:14

数据结构二叉树

2023-05-08 15:57:16

二叉树数据结构

2021-09-15 07:56:32

二叉树层次遍历

2022-11-04 07:12:24

JavaScript基准测试

2022-09-04 19:43:05

程序员数据库

2018-09-29 05:31:14

二叉树

2021-01-13 10:03:36

二叉树层序遍历层次遍历

2009-08-11 13:29:57

C#二叉树遍历

2021-09-15 07:40:50

二叉树数据结构算法

2021-04-19 07:47:42

数据结构二叉树Tree

2021-07-13 11:32:41

二叉树数据结构算法

2024-01-23 12:54:00

C++编程语言代码

2013-06-28 10:17:04

2021-07-16 08:57:31

迭代遍历二叉树

2011-05-31 09:22:39

程序员
点赞
收藏

51CTO技术栈公众号