C语言数据结构系列篇二叉树的遍历

C语言数据结构系列篇:二叉树的遍历

二叉树(Binary Tree)是一种树形结构,它由一个根节点和两个子树组成,这两个子树都是二叉树,被称为左子树和右子树。二叉树有许多用途,例如用来存储有序列表或具有层级关系的信息等等。本篇将详细讲解二叉树的遍历。

二叉树的遍历

二叉树的遍历即将二叉树中的节点按照某种顺序,一次访问每一个节点。常见的二叉树遍历方式有前序遍历、中序遍历和后序遍历。下面分别对这三种遍历方式进行讲解。

前序遍历

前序遍历是指先访问当前节点的值,然后再访问左子树和右子树。换句话说,遍历顺序为 当前节点 -> 左子树 -> 右子树

前序遍历的递归算法如下:

void preorder_traversal(BinaryTree *node) {
  if (node != NULL) {
    printf("%d ", node->value);          // 1. 访问当前节点
    preorder_traversal(node->leftChild); // 2. 前序遍历左子树
    preorder_traversal(node->rightChild);// 3. 前序遍历右子树
  }
}

例如,对于下面一棵二叉树:

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

按照前序遍历的顺序,遍历结果为: 1 2 4 5 3 6 7

中序遍历

中序遍历是指先访问左子树,然后访问当前节点的值,最后访问右子树。换句话说,遍历顺序为 左子树 -> 当前节点 -> 右子树

中序遍历的递归算法如下:

void inorder_traversal(BinaryTree *node) {
  if (node != NULL) {
    inorder_traversal(node->leftChild);   // 1. 中序遍历左子树
    printf("%d ", node->value);           // 2. 访问当前节点
    inorder_traversal(node->rightChild);  // 3. 中序遍历右子树
  }
}

例如,对于下面一棵二叉树:

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

按照中序遍历的顺序,遍历结果为:4 2 5 1 6 3 7

后序遍历

后序遍历是指先访问左子树,然后访问右子树,最后访问当前节点的值。换句话说,遍历顺序为 左子树 -> 右子树 -> 当前节点

后序遍历的递归算法如下:

void postorder_traversal(BinaryTree *node) {
  if (node != NULL) {
    postorder_traversal(node->leftChild);   // 1. 后序遍历左子树
    postorder_traversal(node->rightChild);  // 2. 后序遍历右子树
    printf("%d ", node->value);            // 3. 访问当前节点
  }
}

例如,对于下面一棵二叉树:

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

按照后序遍历的顺序,遍历结果为:4 5 2 6 7 3 1

示例

下面是一个示例程序,使用上述三种遍历方式遍历二叉树:

#include <stdio.h>
#include <stdlib.h>

typedef struct treeNode TreeNode;
struct treeNode {
  int value;
  TreeNode *leftChild;
  TreeNode *rightChild;
};

TreeNode* new_tree_node(int value) {
  TreeNode *newNode = (TreeNode*)malloc(sizeof(TreeNode));
  newNode->value = value;
  newNode->leftChild = NULL;
  newNode->rightChild = NULL;
  return newNode;
}

void preorder_traversal(TreeNode *node) {
  if (node != NULL) {
    printf("%d ", node->value);
    preorder_traversal(node->leftChild);
    preorder_traversal(node->rightChild);
  }
}

void inorder_traversal(TreeNode *node) {
  if (node != NULL) {
    inorder_traversal(node->leftChild);
    printf("%d ", node->value);
    inorder_traversal(node->rightChild);
  }
}

void postorder_traversal(TreeNode *node) {
  if (node != NULL) {
    postorder_traversal(node->leftChild);
    postorder_traversal(node->rightChild);
    printf("%d ", node->value);
  }
}

int main() {
  TreeNode *root = new_tree_node(1);
  root->leftChild = new_tree_node(2);
  root->rightChild = new_tree_node(3);
  root->leftChild->leftChild = new_tree_node(4);
  root->leftChild->rightChild = new_tree_node(5);
  root->rightChild->leftChild = new_tree_node(6);
  root->rightChild->rightChild = new_tree_node(7);

  printf("Preorder Traversal:\n");
  preorder_traversal(root);

  printf("\nInorder Traversal:\n");
  inorder_traversal(root);

  printf("\nPostorder Traversal:\n");
  postorder_traversal(root);

  return 0;
}

运行结果:

Preorder Traversal:
1 2 4 5 3 6 7
Inorder Traversal:
4 2 5 1 6 3 7
Postorder Traversal:
4 5 2 6 7 3 1

以上就是二叉树的遍历的完整攻略。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C语言数据结构系列篇二叉树的遍历 - Python技术站

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • template标签介绍和使用

    template标签是Django中用于控制网页模板渲染的重要标签,其作用是定义前端的HTML页面,包含HTML结构和样式表样式等信息。在Django框架中,我们可以使用template标签来实现对HTML页面中的变量、循环和条件判断等操作,以使页面的展示达到更灵活的效果。 1. 使用 1.1 定义模板 在Django的APP应用目录中,我们可以创建一个名为…

    其他 2023年4月16日
    00
  • Pyspark获取并处理RDD数据代码实例

    以下是关于Pyspark获取并处理RDD数据的完整攻略,包含两个示例说明: 1. 获取RDD数据 要获取RDD数据,可以使用SparkContext对象的textFile()方法从文件中读取数据,或者使用parallelize()方法从内存中创建RDD。以下是一个示例: from pyspark import SparkContext # 创建SparkCo…

    other 2023年10月19日
    00
  • 走进SpringBoot之配置文件与多环境详解

    走进SpringBoot之配置文件与多环境详解 配置文件的使用 Spring Boot支持多种类型的配置文件,包括: 属性文件(.properties) YAML文件(.yml或.yaml) JSON文件(.json) 在Spring Boot中,我们可以通过在配置文件中定义属性来配置应用程序的行为。配置文件中的属性可以被注入到Spring Bean中,以及…

    other 2023年6月25日
    00
  • vue自定义元素身上的右键事件

    Vue自定义元素身上的右键事件:完整攻略 在Vue中,我们可以使用v-on指令来绑定事件。但是,对于自定义元素,我们需要使用v-on指令的修饰符来绑定右键事件。本攻略将介绍如何在Vue自定义元素身上定右键事件,并提供两个示例。 步骤一:使用v-on指令绑定右键事件 在Vue中,我们可以使用v指令来绑定事件。对于自定义元素,我们使用v-on指令修饰符来绑定右键…

    other 2023年5月9日
    00
  • win10预览版10041官方下载地址 win10预览版10041下载网址

    Win10预览版10041官方下载地址攻略 Win10预览版10041是Windows 10操作系统的一个早期测试版本,本攻略将详细介绍如何获取官方下载地址以及下载该版本的步骤。 步骤一:获取官方下载地址 打开你的网络浏览器,进入微软官方网站。 在微软官方网站的搜索栏中输入“Win10预览版10041官方下载地址”并点击搜索按钮。 在搜索结果中,找到微软官方…

    other 2023年8月4日
    00
  • Atitit 桌面软件跨平台gui解决方案 javafx webview

    Atitit 桌面软件跨平台GUI解决方案:JavaFX WebView Atitit是一款面向跨平台GUI开发的桌面软件。其中,JavaFX WebView 是其重要的组成部分之一,它提供了内嵌网页的能力,用于在桌面应用中展示网页内容。以下是JavaFX WebView的介绍。 JavaFX WebView简介 JavaFX是一个用于创建富应用程序的GUI…

    其他 2023年3月28日
    00
  • 在latex中引用表格

    在LaTeX中引用表格是非常常见的需求,可以方便地在文中引用表格,并自动编号和生成表格目录。以下是关于如何在LaTeX中引用表格的完整攻略,包括语法、用法和两个示例说明。 语法 在LaTeX中引用表格的基本语法如下: \begin{table}[htbp] \centering \caption{表格标题} \label{tab:table_label} \…

    other 2023年5月9日
    00
  • mathcad 15怎么安装?PTC Mathcad 15.0 M050破解版安装教程图文详解

    Mathcad是一款用于工程、科技等领域计算和分析的软件,而PTC Mathcad 15.0 M050是其中的一个版本,下面为大家详细讲解如何安装。 下载软件 首先需要下载PTC Mathcad 15.0 M050破解版的安装文件,可以在一些软件下载站进行下载。下载完成后,解压软件压缩包。 安装Mathcad 15 进入解压后的文件夹,找到“Mathcad_…

    other 2023年6月27日
    00
合作推广
合作推广
分享本页
返回顶部