C语言数据结构二叉树先序、中序、后序及层次四种遍历

C语言数据结构二叉树四种遍历

什么是二叉树

二叉树是一种非常重要的数据结构,在计算机科学中具有广泛的应用。它由节点和边组成,每个节点最多有两个子节点。二叉树有许多种遍历方法,可以用来查找节点、在树中插入新节点、删除节点等操作。

二叉树遍历

二叉树遍历是指对二叉树的节点进行访问,有4种遍历方式:

  • 先序遍历(Preorder Traversal)
  • 中序遍历(Inorder Traversal)
  • 后序遍历(Postorder Traversal)
  • 层次遍历(Breadth-First Traversal)

下面我们将分别介绍每一种遍历方式。

先序遍历

先序遍历是指先访问根节点,再访问左子树和右子树。具体步骤如下:

  1. 访问根节点
  2. 递归地先序遍历左子树
  3. 递归地先序遍历右子树

代码实现如下:

void pre_order_traversal(tree_node *tree) {
  if (tree != NULL) {
    visit(tree);
    pre_order_traversal(tree->left);
    pre_order_traversal(tree->right);
  }
}

其中,visit()函数表示对当前节点的操作。下面是一个示例函数:

void visit(tree_node *node) {
  printf("%d ", node->value);
}

中序遍历

中序遍历是指先访问左子树,再访问根节点和右子树。具体步骤如下:

  1. 递归地中序遍历左子树
  2. 访问根节点
  3. 递归地中序遍历右子树

代码实现如下:

void in_order_traversal(tree_node *tree) {
  if (tree != NULL) {
    in_order_traversal(tree->left);
    visit(tree);
    in_order_traversal(tree->right);
  }
}

后序遍历

后序遍历是指先访问左子树,再访问右子树和根节点。具体步骤如下:

  1. 递归地后序遍历左子树
  2. 递归地后序遍历右子树
  3. 访问根节点

代码实现如下:

void post_order_traversal(tree_node *tree) {
  if (tree != NULL) {
    post_order_traversal(tree->left);
    post_order_traversal(tree->right);
    visit(tree);
  }
}

层次遍历

层次遍历是指按照节点的层次顺序依次访问每个节点。具体步骤如下:

  1. 将根节点放入队列
  2. 取出队列中的第一个节点,访问该节点
  3. 将该节点的左右节点(如果有)放入队列
  4. 重复步骤2和3,直到队列为空

代码实现如下:

void breadth_first_traversal(tree_node *tree) {
  queue *q = new_queue();
  if (tree != NULL) {
    enqueue(q, tree);
  }
  while (!is_empty(q)) {
    tree_node *node = dequeue(q);
    visit(node);
    if (node->left != NULL) {
      enqueue(q, node->left);
    }
    if (node->right != NULL) {
      enqueue(q, node->right);
    }
  }
}

示例

下面是一个创建二叉树并遍历的示例程序。该程序创建了一个如下所示的二叉树:

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

然后分别使用先序遍历、中序遍历、后序遍历、层次遍历的方法输出结果。

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

typedef struct tree_node tree_node;
struct tree_node {
  int value;
  tree_node *left;
  tree_node *right;
};

tree_node *new_node(int value) {
  tree_node *node = malloc(sizeof(tree_node));
  node->value = value;
  node->left = NULL;
  node->right = NULL;
  return node;
}

tree_node *build_tree() {
  tree_node *root = new_node(1);
  root->left = new_node(2);
  root->right = new_node(3);
  root->left->left = new_node(4);
  root->left->right = new_node(5);
  root->right->left = new_node(6);
  root->right->right = new_node(7);
  return root;
}

void visit(tree_node *node) {
  printf("%d ", node->value);
}

void pre_order_traversal(tree_node *tree) {
  if (tree != NULL) {
    visit(tree);
    pre_order_traversal(tree->left);
    pre_order_traversal(tree->right);
  }
}

void in_order_traversal(tree_node *tree) {
  if (tree != NULL) {
    in_order_traversal(tree->left);
    visit(tree);
    in_order_traversal(tree->right);
  }
}

void post_order_traversal(tree_node *tree) {
  if (tree != NULL) {
    post_order_traversal(tree->left);
    post_order_traversal(tree->right);
    visit(tree);
  }
}

void breadth_first_traversal(tree_node *tree) {
  queue *q = new_queue();
  if (tree != NULL) {
    enqueue(q, tree);
  }
  while (!is_empty(q)) {
    tree_node *node = dequeue(q);
    visit(node);
    if (node->left != NULL) {
      enqueue(q, node->left);
    }
    if (node->right != NULL) {
      enqueue(q, node->right);
    }
  }
}

int main() {
  tree_node *tree = build_tree();
  printf("pre-order traversal:\n");
  pre_order_traversal(tree);
  printf("\n");
  printf("in-order traversal:\n");
  in_order_traversal(tree);
  printf("\n");
  printf("post-order traversal:\n");
  post_order_traversal(tree);
  printf("\n");
  printf("breadth-first traversal:\n");
  breadth_first_traversal(tree);
  printf("\n");
  return 0;
}

输出结果如下:

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 
breadth-first traversal:
1 2 3 4 5 6 7 

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C语言数据结构二叉树先序、中序、后序及层次四种遍历 - Python技术站

(0)
上一篇 2023年5月17日
下一篇 2023年5月17日

相关文章

  • Lua中使用table实现的其它5种数据结构

    Lua中使用table可以实现多种数据结构,除了Lua原生支持的数组、哈希表之外,我们还可以用table来实现其他五种数据结构,这些数据结构包括集合(Set)、队列(Queue)、双端队列(deque)、堆栈(stack)以及链表(List)。 Set 集合数据结构中的元素是无序的、不重复的。使用table来实现集合数据结构,可以将元素作为table的key…

    数据结构 2023年5月17日
    00
  • C++ 超详细分析数据结构中的时间复杂度

    C++ 超详细分析数据结构中的时间复杂度攻略 什么是时间复杂度? 时间复杂度是用来衡量算法效率的指标,它表示的是算法的执行时间与问题规模之间的关系,通常用大O记法来表示。 如何分析时间复杂度? 1. 常见时间复杂度 以下是常见的时间复杂度及其对应的执行次数: 时间复杂度 对应执行次数 O(1) 常数级别 O(log n) 对数级别 O(n) 线性级别 O(n…

    数据结构 2023年5月17日
    00
  • 京东LBS推荐算法实践

    作者:京东零售 郑书剑 1、推荐LBS业务介绍 1.1 业务场景 现有的同城购业务围绕京东即时零售能力搭建了到店、到家两种业务场景。同城业务与现有业务进行互补,利用高频,时效性快的特点,可以有效提升主站复访复购频次,是零售的重要战略方向。 1.2 名词解释 LBS:基于位置的服务(Location Based Services)。 下文LBS商品代指京东小时…

    算法与数据结构 2023年4月17日
    00
  • java数据结构之树基本概念解析及代码示例

    Java数据结构之树基本概念解析及代码示例 树的基本概念 树(Tree)是一种非常重要的数据结构,它以“分支和层次”为特点,常用于组织数据,如目录结构、文件系统、网络结构等。 树是由节点(Node)构成的集合,其中有一个节点为根(Root),其他节点被称为子节点。每个节点都有一个父节点,除根节点外,每个节点可以有多个子节点。节点之间的关系称为边(Edge)。…

    数据结构 2023年5月16日
    00
  • C语言数据结构之vector底层实现机制解析

    C语言数据结构之vector底层实现机制解析 什么是vector? vector是C++标准库中的一种容器,可以动态调整大小,用于存储数据。 vector的底层实现机制 vector实际上是通过数组实现的,当需要添加元素时,如果当前数组已满,就会重新创建一个更大的数组,并将原数组中的元素复制到新数组中。这样,内存空间得到了增加,同时操作后的元素仍然是顺序存储…

    数据结构 2023年5月17日
    00
  • el-tree的实现叶子节点单选的示例代码

    下面我将详细讲解“el-tree的实现叶子节点单选的示例代码”的完整攻略。 示例代码实现 el-tree 的实现叶子节点单选,需要在 el-tree 上绑定 @check-change 事件,并通过 check-strictly 属性来配置选择模式。代码示例如下: <template> <el-tree :data="data&q…

    数据结构 2023年5月17日
    00
  • 【牛客小白月赛70】A-F题解【小d和超级泡泡堂】【小d和孤独的区间】【小d的博弈】【小d和送外卖】

    比赛传送门:https://ac.nowcoder.com/acm/contest/53366 难度适中。 ? 作者:Eriktse? 简介:19岁,211计算机在读,现役ACM银牌选手?力争以通俗易懂的方式讲解算法!❤️欢迎关注我,一起交流C++/Python算法。(优质好文持续更新中……)?? 阅读原文获得更好阅读体验:https://www.erikt…

    算法与数据结构 2023年4月17日
    00
  • C++20中的结构化绑定类型示例详解

    ” C++20中的结构化绑定类型示例详解 ” 具体攻略如下: 什么是结构化绑定类型? 结构化绑定类型是C++17中的新特性,它可以让我们将一个复杂类型的元素绑定到某个变量上,从而更方便地使用这些元素。 C++20还进一步扩展了结构化绑定类型的功能,可以通过给用于引用的名字声明类型来进行显式类型的绑定。 结构化绑定类型的基本用法 下面的例子展示了如何使用结构化…

    数据结构 2023年5月17日
    00
合作推广
合作推广
分享本页
返回顶部