B3642 二叉树的遍历 題解

· · 题解

B3642 二叉树的遍历 題解

管理员注:

阅读本文章前,请先阅读 \ \texttt{ShanCreeper} B 题库题解的声明,并了解由于课程需要不展示 C++ 代码。

如需系统学习相关知识点请报名【洛谷-基础算法计划】

首先你要知道什么是树。

树形结构:

例如一棵树:

不好意思,放错了,是这棵树:

这种结构成为,树有以下概念:

可能讲的有点抽象,大概能理解就行了。

那么这道题问的是二叉树,那什么是二叉树呢?

二叉树是树的一种,是每个结点都不超过两个子结点的树。

二叉树的每个结点,可能有:

好接下来讲这道题。

对于任意给定结点,可以访问该结点本身遍历左子树遍历右子树

我们就可以分为前序遍历中序遍历后序遍历

前序遍历(先序遍历):

例如这棵:

我们按照根左右的顺序遍历:

就是这么遍历的,所以前序为 1 \ 2 \ 3 \ 4 \ 5 \ 6 \ 7

中序遍历为:先遍历左子树,然后为根结点,最后遍历右子树

后序遍历为:先遍历左子树,然后遍历右子树,最后为根结点

所以(嘿嘿嘿我放非 C++ Code):

前序遍历

func pre_order(x int){
    fmt.Print(x)
    if tree[x].left==0{
        pre_order(tree[x].left)
    }
    if tree[x].right==0{
        pre_order(tree[x].right)
    }
}

注意,当左子树和右子树存在时,才能继续递归。

中序遍历

func in_order(x int){
    if tree[x].left==0{
        in_order(tree[x].left)
    }   
    fmt.Print(x)
    if tree[x].right==0{
        in_order(tree[x].right)
    }
}

后序遍历

func post_order(x int){
    if tree[x].left==0{
        post_order(tree[x].left)
    }
    if tree[x].right==0{
        post_order(tree[x].right)
    }
    fmt.Print(x)    
}