当前位置:首页数据结构 > 正文

二叉树中:前序遍历、中序遍历和后序遍历算法的原理

作者:野牛程序员:2023-05-03 08:23:18数据结构阅读 2164

二叉树是一种常用的数据结构,它由若干个结点组成,这些结点通过边连接在一起,每个结点最多有两个子结点。二叉树有以下特点:

  1. 二叉树的结点最多有两个子结点,一个是左子结点,一个是右子结点,如果一个结点没有子结点,则称为叶子结点。

  2. 二叉树的子树有左右之分,左子树和右子树都是二叉树。

  3. 二叉树的结点可以用数组或链表表示,其中一个结点的数据元素被称为该结点的值。

  4. 二叉树的遍历有三种方式,分别是前序遍历、中序遍历和后序遍历。

  5. 二叉树的层数是从根节点开始算起,根节点为第一层,它的子结点为第二层,以此类推。

  6. 二叉树可以为空树,即不包含任何结点。

二叉树在计算机科学中有广泛应用,比如搜索树、堆、表达式树等。掌握二叉树的基本概念和遍历算法,是算法和数据结构学习的基础。


二叉树的遍历是指按照某一规则遍历树中所有结点,使每个结点被访问一次且仅访问一次。常用的三种遍历方式是前序遍历、中序遍历和后序遍历。

前序遍历:先访问根结点,然后先序遍历左子树,最后先序遍历右子树。即根结点->左子树->右子树。

中序遍历:先中序遍历左子树,然后访问根结点,最后中序遍历右子树。即左子树->根结点->右子树。

后序遍历:先后序遍历左子树,然后后序遍历右子树,最后访问根结点。即左子树->右子树->根结点。

在二叉树的遍历过程中,每个结点的遍历顺序与其子结点的顺序有关,因此可以使用递归算法实现。对于每个结点,先访问它本身,然后递归遍历它的左子树和右子树,直到遍历完整个二叉树。

在代码实现中,前序遍历、中序遍历和后序遍历算法都是基于递归的思想实现的,即先访问当前结点,然后递归遍历左子树和右子树。但它们的区别在于访问结点的时间点不同,具体而言:

  • 前序遍历在递归遍历左子树之前先访问当前结点;

  • 中序遍历在递归遍历左子树之后才访问当前结点,但在递归遍历右子树之前;

  • 后序遍历在递归遍历右子树之后才访问当前结点。

这样就可以实现三种不同的遍历方式,方便我们在不同的场景下使用。

假设有以下二叉树:

       1
     /   \\
    2     3
   / \\   / \\
  4   5 6   7

以此二叉树为例,我们可以演示三种不同的遍历方式:

前序遍历:1 2 4 5 3 6 7

中序遍历:4 2 5 1 6 3 7

后序遍历:4 5 2 6 7 3 1

下面是具体的遍历过程:

  1. 前序遍历过程:

首先访问根结点 1,然后递归遍历左子树 2-4-5,最后递归遍历右子树 3-6-7。因此前序遍历结果为:1 2 4 5 3 6 7。

  1. 中序遍历过程:

首先递归遍历左子树 4-2-5,然后访问根结点 1,最后递归遍历右子树 6-3-7。因此中序遍历结果为:4 2 5 1 6 3 7。

  1. 后序遍历过程:

首先递归遍历左子树 4-5-2,然后递归遍历右子树 6-7-3,最后访问根结点 1。因此后序遍历结果为:4 5 2 6 7 3 1。


下面是完整的 C++ 代码,其中包括二叉树的创建、前序遍历、中序遍历和后序遍历的实现:

#include<iostream>
using namespace std;

struct TreeNode{
    int val;
    TreeNode* left;
    TreeNode* right;
    TreeNode(int x) : val(x), left(NULL), right(NULL){}
};

// 创建二叉树
void createTree(TreeNode* &root){
    int num;
    cin >> num;
    if(num == -1) root = NULL;
    else{
        root = new TreeNode(num);
        createTree(root->left);
        createTree(root->right);
    }
}

// 前序遍历
void preOrder(TreeNode* root){
    if(root == NULL) return;
    cout << root->val << " ";
    preOrder(root->left);
    preOrder(root->right);
}

// 中序遍历
void inOrder(TreeNode* root){
    if(root == NULL) return;
    inOrder(root->left);
    cout << root->val << " ";
    inOrder(root->right);
}

// 后序遍历
void postOrder(TreeNode* root){
    if(root == NULL) return;
    postOrder(root->left);
    postOrder(root->right);
    cout << root->val << " ";
}

int main(){
    TreeNode* root;
    createTree(root);

    cout << "Pre-order traversal: ";
    preOrder(root);
    cout << endl;

    cout << "In-order traversal: ";
    inOrder(root);
    cout << endl;

    cout << "Post-order traversal: ";
    postOrder(root);
    cout << endl;

    return 0;
}

在程序运行时,用户输入的数据是二叉树的结点值,其中 -1 表示该结点为空。通过 createTree() 函数可以创建一棵二叉树,然后通过 preOrder()、inOrder() 和 postOrder() 函数可以分别进行前序遍历、中序遍历和后序遍历,输出遍历结果。

如二叉树:

       1
     /   \\
    2     3
   / \\   / \\
  4   5 6   7

输入数据为:1  2  4  -1  -1  5  -1  -1  3  6  -1  -1  7  -1  -1

运行结果为:

Pre-order traversal: 1 2 4 5 3 6 7 
In-order traversal: 4 2 5 1 6 3 7 
Post-order traversal: 4 5 2 6 7 3 1

\"FAJ~7_HN4P1O22R@(N(994J.png\"/


可以看到,程序输出了二叉树的前序遍历、中序遍历和后序遍历结果,与我们之前手动计算得到的结果一致。

野牛程序员教少儿编程与信息学奥赛-微信|电话:15892516892
野牛程序员教少儿编程与信息学竞赛-微信|电话:15892516892
相关推荐

最新推荐

热门点击