二叉树的三种遍历方式

简介: 二叉树的三种遍历方式

  目录

1.二叉树的结构:

2.二叉树的前序遍历:

3.二叉树的中序遍历:

4.二叉树的后序遍历:

5.二叉树前、中、后序的代码实现:

前序遍历函数:

中序遍历函数:

后序遍历:

完整代码:

代码运行结果截图:


image.gif编辑

1.二叉树的结构:

每一个二叉树均可以分为三部分:1.根节点 2.左子树 3.右子树。

比如上图中的A的左右子树分别是B、C,而E的左右子树为NULL、NULL。通常我们把NULL省略。

2.二叉树的前序遍历:

又叫先根遍历,遍历顺序是根节点、左子树、右子树。

上图的前序遍历:A B D NULL NULL E NULL NULL C NULL NULL

省略NULL后:A B D E C

3.二叉树的中序遍历:

遍历顺序:左子树、根节点、右子树

上图的中序遍历:NULL D NULL B NULL E NULL A NULL C NULL

省略NULL后:D B E A C

4.二叉树的后序遍历:

遍历顺序:左子树、右子树、根节点

上图的中序遍历:NULL NULL D NULL NULL E B NULL NULL C A

省略NULL后:D E B C A

5.二叉树前、中、后序的代码实现:

前序遍历函数:

void prev_order(BTNode* root)//前序遍历
{
  if (root == NULL)
  {
    printf("NULL");
    return;
  }
  printf("%c ", root->data);
  prev_order(root->left);
  prev_order(root->right);
}

image.gif

image.gif编辑

中序遍历函数:

void on_order(BTNode* root)//中序遍历
{
  if (root == NULL)
  {
    printf("NULL\n");
    return;
  }
  prev_order(root->left);
  printf("%c ", root->data);
  prev_order(root->right);
}

image.gif

image.gif编辑

后序遍历:

void post_order(BTNode* root)//后序遍历
{
  if (root == NULL)
  {
    printf("  NULL   \n");
    return;
  }
  prev_order(root->left);
  prev_order(root->right);
  printf("%c    ", root->data);
}

image.gif

image.gif编辑

完整代码:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
typedef char BTDataType;
typedef struct BinaryTreeNode
{
  BTDataType data;
  struct BinaryTreeNode* left;
  struct BinaryTreeNode* right;
}BTNode;
BTNode* BuyNode(BTDataType x)//开辟空间存储变量
{
  BTNode* newnode = (BTNode*)malloc(sizeof(BTNode));
  newnode->data = x;
  newnode->left = NULL;
  newnode->right = NULL;
  return newnode;
}
void prev_order(BTNode* root)//前序遍历
{
  if (root == NULL)
  {
    printf("NULL");
    return;
  }
  printf("%c ", root->data);
  prev_order(root->left);
  prev_order(root->right);
}
void on_order(BTNode* root)//中序遍历
{
  if (root == NULL)
  {
    printf("NULL\n");
    return;
  }
  prev_order(root->left);
  printf("%c ", root->data);
  prev_order(root->right);
}
void post_order(BTNode* root)//后序遍历
{
  if (root == NULL)
  {
    printf("  NULL   \n");
    return;
  }
  prev_order(root->left);
  prev_order(root->right);
  printf("%c    ", root->data);
}
int main(void)
{
  BTNode* n1 = BuyNode('A');
  BTNode* n2 = BuyNode('B');
  BTNode* n3 = BuyNode('C');
  BTNode* n4 = BuyNode('D');
  BTNode* n5 = BuyNode('E');
  n1->left = n2;
  n1->right = n3;
  n2->left = n4;
  n2->right = n5;
  prev_order(n1);
  printf("\n");
  on_order(n1);
  printf("\n");
  post_order(n1);
  printf("\n");
  return 0;
}

image.gif

代码运行结果截图:

image.gif编辑


目录
相关文章
|
关系型数据库 MySQL 数据处理
FlinkCDC 增量读取 binlog 数据比较慢
FlinkCDC 增量读取 binlog 数据比较慢
684 1
|
SQL Oracle 关系型数据库
各种JOIN的区别
各种JOIN的区别
470 2
|
12月前
|
人工智能 运维 安全
阿里云飞天企业版“智算升级”,为政企打造AI时代最开放的云
阿里云正式发布飞天智算—飞天企业版V3.18,为政企客户打造AI时代最开放的云。此次升级,飞天企业版将智算能力深度融入云平台,实现“一云多算”,满足政企客户对云平台“云+AI”协同发展需求,为AI技术大规模在政企领域应用做好准备。
860 11
|
前端开发 JavaScript Java
揭开 JavaScript 垃圾回收的秘密——一场与内存泄漏的生死较量,让你的代码从此焕然一新!
【8月更文挑战第23天】本文通过多个实例深入探讨了JavaScript中的垃圾回收机制及其对应用性能的影响。首先介绍了基本的内存管理方式,随后分析了变量不再使用时的回收过程。接着,通过事件监听器未被移除及全局变量管理不当等场景展示了常见的内存泄漏问题。最后,文章介绍了使用`WeakRef`和`FinalizationRegistry`等现代API来有效避免内存泄漏的方法。理解并运用这些技术能显著提升Web应用的稳定性和效率。
180 0
|
JavaScript Java 测试技术
基于ssm+vue.js+uniapp小程序的水果商城附带文章和源代码部署视频讲解等
基于ssm+vue.js+uniapp小程序的水果商城附带文章和源代码部署视频讲解等
315 10
|
JSON 开发工具 数据格式
App Inventor 2 接入阿里云短信服务,实现短信验证码功能
App Inventor 2 接入阿里云短信服务,实现短信验证码功能:发送短信验证码功能一般都是基于短信平台提供的sdk进行调用,这里是基于阿里云短信平台进行的开发。
461 1
|
存储 运维 JavaScript
云HIS是什么?HIS系统为什么要上云?云HIS有哪些优点?
云HIS的主要功能作用是提供四个面向的服务,即面向居民的健康服务、面向医疗机构的医疗服务、面向各级管理机关的卫生管理服务、面向其它卫生机构的卫生协同服务。
1008 1
|
JavaScript 前端开发 API
用Python和Vue构建内容管理系统(CMS):一步步指南
【4月更文挑战第10天】本文介绍了如何使用Python的Django框架和前端的Vue.js构建内容管理系统(CMS)。Django提供后端支持,遵循MTV模式,Vue.js则用于创建数据驱动的用户界面。步骤包括环境准备、Django项目与应用创建、定义数据模型、创建API接口、搭建Vue项目、集成Django与Vue、性能优化及部署上线。这种结合充分利用两者优势,实现高效、可扩展的CMS解决方案,适应未来智能化、个性化的趋势。
737 0
|
IDE JavaScript 开发工具
DevEco Studio 3.1IDE环境配置(HarmonyOS 3.1)
DevEco Studio 3.1IDE环境配置(HarmonyOS 3.1)
290 1
|
网络协议 Java Linux
用Java来实现BIO和NIO模型的HTTP服务器(二) NIO的实现
用Java来实现BIO和NIO模型的HTTP服务器(二) NIO的实现