C语言算法基础——二叉树的实现

2023-10-31



前言

1、二叉树(Binary tree)是树形结构的一个重要类型。许多实际问题抽象出来的数据结构往往是二叉树形式,即使是一般的树也能简单地转换为二叉树,而且二叉树的存储结构及其算法都较为简单,因此二叉树显得特别重要。二叉树特点是每个节点最多只能有两棵子树,且有左右之分 。
2、二叉树是n个有限元素的集合,该集合或者为空、或者由一个称为根(root)的元素及两个不相交的、被分别称为左子树和右子树的二叉树组成,是有序树。当集合为空时,称该二叉树为空二叉树。在二叉树中,一个元素也称作一个节点 。

百度百科-二叉树


一、实现二叉树的基本思想

1、二叉树的结构其实和链表类似,一个结构体中有一个数据域和两个指针域,只不过链表是顺序的,二叉树是树状的。
2、二叉树的遍历:
(1)前序遍历:先访问根节点,再访问左节点,最后访问右节点
(2)中序遍历:先访问左节点,再访问根节点,最后访问右节点
(3)后序遍历:先访问左节点,再访问右节点,最后访问根节点
3、二叉树无论是实现还是使用,都离不开递归,递归的思想非常不好理解,而且从理解到实现还需要一个过程,需要大家多多思考。

二、二叉树的代码

1.二叉树的结构体

#include<stdio.h>
#include<stdlib.h>
typedef struct tree_node
{
	int data;//数据域
	struct tree_node *left;//左指针
	struct tree_node *right;//右指针
}Tree_Node;

2.二叉树的初始化

初始化即创建根节点

Tree_Node *init()
{
	Tree_Node *root=(Tree_Node *)malloc(sizeof(Tree_Node));//为根节点申请地址
	root->left=NULL;
	root->right=NULL;
	root->data=0;
	return root;
}

3.二叉树的创建

构建一个二叉树,给二叉树子节点申请空间并赋值,输入-1则节点为空

Tree_Node *create(Tree_Node *root)
{
	int value;
	scanf("%d", &value);//输入当前节点的值
	if (value == -1)
	{
		root = NULL;
	}
	else
	{
		root=(Tree_Node *)malloc(sizeof(Tree_Node));//为新节点申请空间
		root->data=value;
		root->left=create(root->left);//递归左子树
		root->right=create(root->right);//递归右子树
	}
	return root;
}

4.前中后序遍历

//前序遍历
void pre_traverse(Tree_Node *root)
{
	if(root==NULL)
		return;
	printf("%-5d",root->data);//先打印数据
	pre_traverse(root->left);//递归左子树
	pre_traverse(root->right);//递归右子树,下面的同理
}
//中序遍历
void mid_traverse(Tree_Node *root)
{
	if(root==NULL)
		return;
	mid_traverse(root->left);
	printf("%-5d",root->data);
	mid_traverse(root->right);
}
//后续遍历
void aft_traverse(Tree_Node *root)
{
	if(root==NULL)
		return;
	aft_traverse(root->left);
	aft_traverse(root->right);
	printf("%-5d",root->data);
}

5.求树的深度

二叉树的深度是指二叉树的所有结点中最深的结点所在的层数。
举个例子:
1、一颗树只有一个节点,它的深度是1;

2、二叉树的根节点只有左子树而没有右子树,那么可以判断,二叉树的深度应该是其左子树的深度加1;

3、二叉树的根节点只有右子树而没有左子树,那么可以判断,那么二叉树的深度应该是其右树的深度加1;

4、二叉树的根节点既有右子树又有左子树,那么可以判断,那么二叉树的深度应该是其左右子树的深度较大值加1。

int get_height(Tree_Node *root)
{
	int lh=0,rh=0;//lh左子树的深度,rh右子树的深度
	if(root==NULL)
		return 0;
	lh=get_height(root->left);//左子树递归
	rh=get_height(root->right);//右子树递归
	return 1+(lh>rh?lh:rh);//?:表达式,如果lh>rh返回lh,否则返回rh
}

6.二叉树的翻转

翻转二叉树

void reverse_tree(Tree_Node *root)
{
	if (root != NULL)
    {
		Tree_Node *s;
        s = root->left;
        root->left = root->right;
        root->right = s;
        reverse_tree(root->left);
        reverse_tree(root->right);
    }
}

7.主函数测试

主函数:创建树,翻转后输出前中后序遍历

int main()
{
	Tree_Node *root=init();
	root=create(root);//创建树
	reverse_tree(root);//翻转树
	printf("previous traverse output:\n");
	pre_traverse(root);
	printf("\nmiddle traverse output:\n");
	mid_traverse(root);
	printf("\nafter traverse output:\n");
	aft_traverse(root);
	printf("\n");
}

8.结果展示

输入的树:
在这里插入图片描述

未翻转前:
在这里插入图片描述
翻转后:
在这里插入图片描述


总结

今天就不总结了……

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C语言算法基础——二叉树的实现 的相关文章

随机推荐

  • 关于自搭网站XAMPP(一)前后端AJAX-PHP数据连通

    前端AJAX代码
  • DEDECMS如何将图片轮播做到后台控制

    网上找了一大堆 试了好多方法 都不管用 最后偶尔看到这几行代码 没想到成功了 然后自己做个总结 方法如下 直接建立一个顶级栏目 然后在该顶级栏目里添加文档 在文档里面只上传缩略图 不要添加内容 然后在模板页面调用下面的代码标签 就好啦 把下
  • CRC32爆破小结

    前言 最近在bugku遇到了一道隐写题 binwalk之后发现里面有很多个压缩包 然后就无从下手 于是查看别人大佬的wp才发现是CRC32爆破 由于本人第一次遇到这种题目 就记录一下吧 正文 CRC想必大家都知道 它的全称是循环冗余校验 C
  • 2022-面试题汇总

    1 四大频繁Full GC原因 1 大量反射代码使永久代类太多导致频繁Full GC 解决方案 在有大量反射代码的场景下 只要把 XX SoftRefLRUPolicyMSPerMB 0 这个参数设置大一些即可 千万别让一些新手同学设置为0
  • 图像处理库(fbc_cv):源自OpenCV代码提取

    在实际项目中会经常用到一些基本的图像处理操作 而且经常拿OpenCV进行结果对比 因此这里从OpenCV中提取了一些代码组织成fbc cv库 项目fbc cv所有的代码已放到GitHub中 地址为 https github com feng
  • java总结输入流输出流

    1 什么是IO Java中I O操作主要是指使用Java进行输入 输出操作 Java所有的I O机制都是基于数据流进行输入输出 这些数据流表示了字符或者字节数据的流动序列 Java的I O流提供了读写数据的标准方法 任何Java中表示数据源
  • 算法笔记-图搜索

    统计图的连通分支数 思路 建图 搜索 注意这种建图方式是有向图 反例 1 2 3 4 4 1这种不会识别出来 因此建图时需要使用有向图 在add阶段加入两个方向的路径 add时从1开始的边的标号 0用来判断结束 斗则冲突有问题 int to
  • 追雨的际遇

    追雨 下班 刚出公司 隐约看到远处电闪雷鸣 明明今天是大好的晴天 看到电闪 确实稀奇 忽然豆大的雨点落了下来 恰逢我骑到桥洞底下 让雨先跑10分钟 等我换好雨衣 就去追她 桥洞底下 停车 开后备箱 开始换雨衣 陆续很多摩托停在我的身后 他们
  • Vue使用v-for遍历map

    功能 遍历数据库中按钮的图片和名字 当页面打开时 触发查询事件 以下图形式显示出来 前端代码 遍历存在数据库中的按钮名称和图片名称 其中按钮的click事件名称和按钮图片名称相同
  • 【Linux】Linux是如何诞生的?

    本文主要讲述Linux的诞生背景以及一些小故事 其中 还清晰地讲述了Unix BSD GUN GPL等名词的含义及来源 Table of Contents Unix C语言 BSD GUN GPL Linux Linux的内核发展 注意 本
  • 无法打开程序因为msvcp140.dll丢失,msvcp140.dll丢失的解决方法

    前几天看到有小伙伴再问什么是msvcp140 dll文件 相信很多人都不知道这是什么吧 如果电脑msvcp140 dll文件丢失的话会怎么样呢 丢失了应该如何找回呢 其实这些都是一些比较常见的电脑知识 我们是需要去了解一下的 废话不多说 下
  • DearMob iPhone Manager for Mac(iPhone手机数据加密传输软件)

    DearMob iPhone Manager 是Mac平台上一款功能强大的iPhone数据传输工具 无需iTunes即可完成数据传输 DearMob iPhone Manager Mac版能够为您进行影片 音乐 照片 通讯录等内容进行传输或
  • PyTorch实现ResNet18

    ResNet 18结构 基本结点 代码实现 import torch import torch nn as nn from torch nn import functional as F class RestNetBasicBlock nn
  • 【Qt】QString转char*

    2023年8月18日 周五上午 QString Qstr 巨龙之路 char Cstr Qstr toUtf8 data
  • VIPCODE:机器人编程的好处与坏处

    机器人编程的好处与坏处 对于家长们来说 孩子的学习一直都是他们十分关心和重视的一个事情 家长在培养孩子的学习方面也是非常的认真耐心的 就拿现在很多的家长想要孩子去学习机器人编程的课程来说 有的家长对于机器人编程的好处与坏处其实并不是很清楚
  • css 盒模型

    css 盒模型 html元素可以看成一个盒子 包括 边框 编剧 填充和实际内容 盒子模型 Box Model Margin 外边距 清除边框区域 Margin没有背景颜色 它是完全透明的 Border 边框 边框周围的填充和内容 Paddi
  • Caffe源码中math_functions文件分析

    Caffe源码 caffe version 09868ac date 2015 08 15 中有一些重要文件 这里介绍下math functions文件 1 include文件 1
  • 将单链表记录的数据写入到文本文件中

    C语言单链表详解 附加强练习 mc10141222的博客 CSDN博客 继上一个讲单链表的文章 我们只需要在那个基础上再加一点代码便能将所记录的学生数据写入到我们所要写入的文本文件中 这涉及到文件的读写 因此练习一下这个也能顺便帮我们更好地
  • SpringCloud基本原理及应用(一)

    1 springcloud简介 主要提供了微服务开发所需的配置管理 服务发现 断路器 智能路由 微代理 控制总线 全局锁 决策竞选 分布式会话和集群状态管理等组件 可以跟spring boot框架一起使用 会让你开发微服务架构的云服务非常好
  • C语言算法基础——二叉树的实现

    文章目录 前言 一 实现二叉树的基本思想 二 二叉树的代码 1 二叉树的结构体 2 二叉树的初始化 3 二叉树的创建 4 前中后序遍历 5 求树的深度 6 二叉树的翻转 7 主函数测试 8 结果展示 总结 前言 1 二叉树 Binary t