C语言二叉树的基本操作
时间:2022-07-25
本文章向大家介绍C语言二叉树的基本操作,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
树是数据结构中一门很重要的数据结构,在很多地方都能经常见到他的面孔,比如数据通信,压缩数据等都能见到树的身影。但是最常见的还是相对简单的二叉树,二叉树和常规树都可以进行相互转换。所以,二叉树的操作必不可少。我这里来简单介绍一下。 在数据结构中给的树和图中,我们最好使用递归来进行各种操作,会让代码更清晰易懂,代码也会更简洁。
开始
添加适当的头文件,定义hex一个栈数据结构,
首先我们定义一个二叉树的数据结构
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 100
typedef char ElemType;
typedef struct BiTNode
{
ElemType data;
struct BiTNode *lchild, *rchild;
}BiTNode, *BiTree;
创建一个二叉树(前序)
这里以前序作为例子,前中后序遍历的不同之在于递归的顺序
void creatBiTree(BiTree *T) {
ElemType c;
scanf("%c", &c);
if ('#' == c)
{
*T = NULL;
}
else
{
*T = (BiTNode *)malloc(sizeof(BiTNode));
(*T)->data = c;
creatBiTree(&(*T)->lchild);
creatBiTree(&(*T)->rchild);
}
}
遍历二叉树(前序遍历)
这里依然以前序作为例子,前中后序遍历的不同之在于递归的顺序
void preorder(BiTree T) {
if (T) {
printf("%cn", T->data);
preorder(T->lchild);
preorder(T->rchild);
}
}
层次遍历二叉树
void levelorder(BiTree T) {
//用一个队列保存结点信息,这里的队列采用的是顺序队列中的数组实现
int front = 0;
int rear = 0;
BiTree BiQueue[MAXSIZE];
BiTree tempNode;
if (!IsEmpty_BiTree(&T)) {
//将根结点加入到队列中
BiQueue[rear++] = T;
while (front != rear) {
//取出队头元素,并使队头指针向后移动一位
tempNode = BiQueue[front++];
//判断左右子树是否为空,若为空,则加入队列
if (!IsEmpty_BiTree(&(tempNode->lchild)))
BiQueue[rear++] = tempNode->lchild;
if (!IsEmpty_BiTree(&(tempNode->rchild)))
BiQueue[rear++] = tempNode->rchild;
//输出队头结点元素
//Vist_BiTreeNode(tempNode->data);
printf("%cn", tempNode->data);
}
}
}
复制树
将二叉树复制给另一个二叉树
void copybitree(BiTree T, BiTree *newT) {
if (T == NULL)
{
*newT = NULL;
return;
}
else
{
*newT = (BiTNode *)malloc(sizeof(BiTNode));
((*newT)->data) = (T->data);
copybitree(T->lchild, &(*newT)->lchild);
copybitree(T->rchild, &(*newT)->rchild);
}
}
计算结点个数
计算二叉树的结点个数
int countleaf(BiTree T) {
if (T == NULL)
{
return 0;
}
else {
return countleaf(T->lchild) + countleaf(T->rchild) + 1;
}
}
左、右子树交换
交换一颗二叉树的左右子树
void exchange(BiTree T)
{
BiTree p;
if (T != NULL)
{
p = T->lchild;
T->lchild = T->rchild;
T->rchild = p;
exchange(T->lchild);
exchange(T->rchild);
}
}
主函数
void main() {
BiTree T=NULL,newT=NULL;
creatBiTree(&T);
printf("前序遍历n");
preorder(T);
printf("中序遍历n");
inorder(T);
printf("中后遍历n");
postorder(T);
printf("层序遍历n");
levelorder(T);
printf("节点个数为%dn", countleaf(T));
copybitree(T, &newT);
printf("newT前序遍历n");
preorder(newT);
exchange(T);
printf("交换左右子树之后前序遍历为");
preorder(T);
}
以上就是二叉树的一些基本操作,大量运用的递归的思想,希望读者能好好研读
注:
- 上述代码在visual studio 2015中编译成功运行,其他ide请自行测试
- 上述文字皆为个人看法,如有错误或建议请及时联系我
- Druid-目前最好的连接池
- 【算法】哈希表的诞生
- java中获得文件大小代码
- 【Java】泛型学习笔记
- 读写文件具体操作
- 【算法】赫夫曼树(Huffman)的构建和应用(编码、译码)
- ERROR 1396 (HY000): Operation CREATE USER faile...
- hive安装后测试
- 【算法】论平衡二叉树(AVL)的正确种植方法
- 【JavaScript】 JS面向对象的模式与实践
- log4j:ERROR Failed to load driver
- 前端MVC Vue2学习总结(七)——ES6与Module模块化、Vue-cli脚手架搭建、开发、发布项目与综合示例
- 前端MVC Vue2学习总结(六)——axios与跨域HTTP请求、Lodash工具库
- spring之config.xml完整版示例
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Spark 面试题系列-1
- Spark 面试题系列-2
- tf-operator 的测试
- Kubeflow 部署采坑记录
- Kubeflow v0.6.0 部署采坑记录
- Kubeflow Pipeline 部署记录
- Kubeflow Pipeline - 上传一个 Pipeline
- Kubeflow Pipeline - 构建自定义的 Workflow
- R语言入门之变量重编码与重命名
- Kubeflow Pipeline - 构建一个机器学习 Workflow
- Git 如何压缩 commit
- How go build works
- 网状Meta分析之R语言‘gemtc’包实战(3)
- 关于 K8S API Resources: Group 和 Version 该怎么写
- ZooKeeper 的应用场景