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

yizhihongxing

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日

相关文章

  • Win10专业版错误提示“你的电脑遇到问题,需要重新启动”怎么办

    Win10专业版错误提示“你的电脑遇到问题,需要重新启动”怎么办? 概述 在使用 Windows 10 专业版计算机时,有时可能会遇到错误提示“你的电脑遇到问题,需要重新启动”。这种错误通常被称为 BSOD 或蓝屏(Blue Screen of Death),并且可能由多种原因引起。 本文将提供一些可能有助于解决此问题的步骤和建议。 步骤 步骤1:等待重启完…

    other 2023年6月27日
    00
  • less的基本用法

    以下是关于“less的基本用法”的完整攻略,过程中包含两个示例。 背景 less是一种Linux/Unix系统下的分页查看器,它可以用于查看文本文件的内容。与cat命令不同,less可以将文本分页显示,方便用户查看大型文本文件。在Linux/Unix系统中,less是一种常常用的工具。 基本用法 在Linux/Unix系统中,使用less非常简单。具体步骤如…

    other 2023年5月9日
    00
  • C#的winform如何嵌套另一个exe程序

    C#的WinForm如何嵌套另一个exe程序 在C#的WinForm应用程序中,可以通过嵌套另一个exe程序来实现一些特定的功能或者集成其他应用程序。下面是一个详细的攻略,包含两个示例说明。 示例1:使用Process类嵌套另一个exe程序 首先,在你的WinForm应用程序中添加一个按钮或者其他触发事件的控件。 在按钮的点击事件中,使用Process.St…

    other 2023年7月28日
    00
  • 使命召唤战区2弹错误代码怎么办 错误代码解决方法整理

    使命召唤战区2弹错误代码怎么办 在玩使命召唤战区2时,你可能会遇到一些弹出的错误代码,这些代码通常与游戏的连接或程序有关。本文将为你整理几种常见的错误代码,并提供相应的解决方法。 游戏连接错误 BLZBNTBGS00000BC6 这是一种常见的连接错误,通常是由于网络连接问题导致。为解决这个问题,你可以尝试以下几个方法: 重新启动你的路由器和计算机。有时候,…

    other 2023年6月27日
    00
  • Swift调用Objective-C代码

    Sure! 对于Swift调用Objective-C代码,主要涉及到以下几个步骤: 创建Objective-C代码 创建Swift文件,并确保Bridge Header文件正确引入 在Swift文件中调用Objective-C代码 下面我们分步骤进行详细探讨: 创建Objective-C代码 首先我们需要创建一个Objective-C代码文件,在里面编写我们…

    other 2023年6月26日
    00
  • springboot自动重启的简单方法

    下面我来详细讲解如何使用Spring Boot实现自动重启的简单方法。 什么是Spring Boot自动重启? 在日常开发中,我们经常需要修改代码并重新启动应用程序才能看到更新后的效果,这个过程非常繁琐。而Spring Boot提供了一种自动重启的机制,可以在代码修改后自动重新编译并重启应用程序,从而节省开发人员的时间。 实现Spring Boot自动重启的…

    other 2023年6月27日
    00
  • Android 自定义来电秀实现总结

    Android 自定义来电秀实现总结 简介 自定义来电秀(CallShow)是指在手机接收到来电的时候,能够显示出一个自定义的界面,比如可以用来展示对方的头像、姓名和归属地等信息,或者展示一段特别的动画等等。对于Android开发者来说,实现一个自定义的来电秀是一项非常有挑战性的任务。在本篇文章中,我将分享一下自己实现来电秀的经验和总结,以帮助更多的开发者掌…

    other 2023年6月25日
    00
  • Spring读取配置文件属性实现方法

    Spring框架提供了多种读取配置文件属性的方式,常见的几种实现方法分别是: 1.使用@Value注解 @Value注解可以直接将配置文件中的属性赋给对应的变量,示例如下: @Value("${config.property}") private String property; 其中${config.property}就是对应的配置文件…

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