数据结构与算法:二叉树

一、二叉树的链式存储

树结点数据结构
typedef char BiElemType;
typedef struct BiTNode{BiElemType c;struct BiTNode *lchild;struct BiTNode *rchild;
}BiTNode,*BiTree;树中任何一个结点都是一个结构体,它的空间是通过malloc申请出来的 

二、二叉树层次建树

#include <stdio.h>
#include <stdlib.h>typedef char BiElemType;
typedef struct BiTNode{BiElemType c;struct BiTNode *lchild;struct BiTNode *rchild;
}BiTNode,*BiTree;//tag结构体是辅助队列使用的
typedef struct tag{BiTree p; //树的某一个结点的地址值struct tag *pnext; 
}tag_t,*ptag_t; int main(){BiTree pnew; //用来指向新申请的树结点 BiTree tree=NULL; //tree是指向树根,代表树 //phead队列头,ptail队列尾ptag_t phead=NULL,ptail=NULL,listpnew=NULL,pcur=NULL;char c;while(scanf("%c",&c)){if(c=='\n'){break; //读到换行就结束 }//calloc申请的空间大小是两个参数直接相乘,并对空间进行初始化,赋值为0 pnew=(BiTree)calloc(1,sizeof(BiTNode)); pnew->c=c;listpnew=(ptag_t)calloc(1,sizeof(tag_t)); //给队列结点申请空间 listpnew->p=pnew;//如果是树的第一个结点if(tree==NULL){tree=pnew; //tree指向树的根结点 phead=listpnew; //第一个结点既是队列头又是队列尾 ptail=listpnew;pcur=listpnew; //pcur要指向进入树的父亲元素 continue;}else{//让元素先入队列ptail->pnext=listpnew;ptail=listpnew;} //接下来把pnew结点放入树中 if(pcur->p->lchild==NULL){pcur->p->lchild=pnew;}else if(pcur->p->rchild==NULL){pcur->p->rchild=pnew;pcur=pcur->pnext;}				}return 0;
}

三、二叉树的前序中序后序遍历

前序遍历:先打印自身,再打印左子树,再打印右子树(preOrder)深度优先遍历

中序遍历:先打印左子树,再打印当前结点,再打印右子树(InOrder)

后序遍历:先打印左子树,再打印右子树,最后打印当前结点(PostOrder)

#include <stdio.h>
#include <stdlib.h>typedef char BiElemType;
typedef struct BiTNode{BiElemType c;struct BiTNode *lchild;struct BiTNode *rchild;
}BiTNode,*BiTree;//tag结构体是辅助队列使用的
typedef struct tag{BiTree p; //树的某一个结点的地址值struct tag *pnext; 
}tag_t,*ptag_t; //递归实现
//前序遍历就是深度优先遍历
void PreOrder(BiTree p){if(p!=NULL){//putchar(p->c);printf("%c",p->c);PreOrder(p->lchild); //打印左子树 PreOrder(p->rchild); //打印右子树 }
}
//中序遍历 
void InOrder(BiTree p){if(p!=NULL){InOrder(p->lchild); //打印左子树 //putchar(p->c);printf("%c",p->c);InOrder(p->rchild); //打印右子树 }
} //后序遍历 
void PostOrder(BiTree p){if(p!=NULL){PostOrder(p->lchild); //打印左子树 PostOrder(p->rchild); //打印右子树 //putchar(p->c);printf("%c",p->c);}
} int main(){BiTree pnew; //用来指向新申请的树结点 BiTree tree=NULL; //tree是指向树根,代表树 //phead队列头,ptail队列尾ptag_t phead=NULL,ptail=NULL,listpnew=NULL,pcur=NULL;char c;while(scanf("%c",&c)){if(c=='\n'){break; //读到换行就结束 }//calloc申请的空间大小是两个参数直接相乘,并对空间进行初始化,赋值为0 pnew=(BiTree)calloc(1,sizeof(BiTNode)); pnew->c=c;listpnew=(ptag_t)calloc(1,sizeof(tag_t)); //给队列结点申请空间 listpnew->p=pnew;//如果是树的第一个结点if(tree==NULL){tree=pnew; //tree指向树的根结点 phead=listpnew; //第一个结点既是队列头又是队列尾 ptail=listpnew;pcur=listpnew; //pcur要指向进入树的父亲元素 continue;}else{//让元素先入队列ptail->pnext=listpnew;ptail=listpnew;} //接下来把pnew结点放入树中 if(pcur->p->lchild==NULL){pcur->p->lchild=pnew;}else if(pcur->p->rchild==NULL){pcur->p->rchild=pnew;pcur=pcur->pnext;}				}printf("前序遍历\n"); PreOrder(tree); printf("中序遍历\n"); InOrder(tree); printf("后序遍历\n"); PostOrder(tree); return 0;
}

四、二叉树的层次遍历

层序遍历、广度优先遍历

#include <stdio.h>
#include <stdlib.h>typedef char BiElemType;
typedef struct BiTNode{BiElemType c;struct BiTNode *lchild;struct BiTNode *rchild;
}BiTNode,*BiTree;//tag结构体是辅助队列使用的
typedef struct tag{BiTree p; //树的某一个结点的地址值struct tag *pnext; 
}tag_t,*ptag_t;//队列的结构体 
typedef BiTree ElemType;
typedef struct LinkNode{ElemType data;struct LinkNode *next;
}LinkNode;
typedef struct{LinkNode *front,*rear; //链表头 链表尾 
}LinkQueue; //先进先出//队列的初始化,使用的是带头结点的链表来实现的 
void InitQueue(LinkQueue &Q){Q.front=Q.rear=(LinkNode *)malloc(sizeof(LinkNode));Q.front->next=NULL; 
} //判断队列是否为空 
bool IsEmpty(LinkQueue Q){if(Q.front==Q.rear)return true;elsereturn false;
}//入队,尾部插入法
void EnQueue(LinkQueue &Q,ElemType x){LinkNode *s=(LinkNode*)malloc(sizeof(LinkNode));s->data=x;s->next=NULL;Q.rear->next=s;Q.rear=s;
} //出队,头部删除法
bool DeQueue(LinkQueue &Q,ElemType &x){if(Q.front==Q.rear)return false;LinkNode *p=Q.front->next;x=p->data;Q.front->next=p->next;if(Q.rear==p)Q.rear=Q.front;free(p);return true;
} //层序遍历 
//层次遍历,层序遍历,广度优先遍历
void LevelOrder(BiTree T){LinkQueue Q;InitQueue(Q);BiTree p; //存储出队的结点 EnQueue(Q,T); //把根入队 while(!IsEmpty(Q)){DeQueue(Q,p);putchar(p->c);if(p->lchild){EnQueue(Q,p->lchild);} if(p->rchild){EnQueue(Q,p->rchild);}}
} 
int main(){BiTree pnew; //用来指向新申请的树结点 BiTree tree=NULL; //tree是指向树根,代表树 //phead队列头,ptail队列尾ptag_t phead=NULL,ptail=NULL,listpnew=NULL,pcur=NULL;char c;while(scanf("%c",&c)){if(c=='\n'){break; //读到换行就结束 }//calloc申请的空间大小是两个参数直接相乘,并对空间进行初始化,赋值为0 pnew=(BiTree)calloc(1,sizeof(BiTNode)); pnew->c=c;listpnew=(ptag_t)calloc(1,sizeof(tag_t)); //给队列结点申请空间 listpnew->p=pnew;//如果是树的第一个结点if(tree==NULL){tree=pnew; //tree指向树的根结点 phead=listpnew; //第一个结点既是队列头又是队列尾 ptail=listpnew;pcur=listpnew; //pcur要指向进入树的父亲元素 continue;}else{//让元素先入队列ptail->pnext=listpnew;ptail=listpnew;} //接下来把pnew结点放入树中 if(pcur->p->lchild==NULL){pcur->p->lchild=pnew;}else if(pcur->p->rchild==NULL){pcur->p->rchild=pnew;pcur=pcur->pnext;}				}printf("层序遍历\n"); LevelOrder(tree);return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/689014.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

<网络安全>《38 网络攻防专业课<第四课 - windows常见漏洞>》

1 系统漏洞概述 系统漏洞概述&#xff1a; 漏洞是指应用软件或操作系统软件在逻辑设计上的缺陷&#xff0c;或在编写时产生的错误。 漏洞是硬件、软件、协议的具体实现或系统安全策略上存在的缺陷&#xff0c;从而可以使攻击者能够在未授权的情况下访问或破坏系统。 2 Window…

JS面向对象:六.原型链

原型链是 JavaScript 中实现对象之间继承关系的一种机制。在 JavaScript 中&#xff0c;每个对象都有一个指向另一个对象的链接&#xff0c;这个链接被称为原型。当试图访问一个对象的属性或方法时&#xff0c;如果该对象本身没有这个属性或方法&#xff0c;JavaScript 就会沿着…

数据安全之认识数据资产管理平台

文章目录 一、什么是数据资产二、什么是数据资产管理平台1、什么是数据资产管理平台2、为什么需要数据资产管理平台 三、数据资产管理平台的主要功能四、数据资产管理平台的工作原理五、数据资产管理平台的应用场景六、安全资产管理平台与数据资产管理平台的区别与关系1、安全资…

华为配置旁挂二层组网直接转发示例

配置旁挂二层组网直接转发示例 组网图形 图1 配置旁挂二层组网直接转发示例组网图 业务需求组网需求数据规划配置思路配置注意事项操作步骤配置文件扩展阅读 业务需求 企业用户通过WLAN接入网络&#xff0c;以满足移动办公的最基本需求。且在覆盖区域内移动发生漫游时&#xff…

已解决ModuleNotFoundError: No module named ‘cv2’异常的正确解决方法,亲测有效!!!

已解决ModuleNotFoundError: No module named ‘cv2’异常的正确解决方法&#xff0c;亲测有效&#xff01;&#xff01;&#xff01; 文章目录 问题分析 报错原因 解决思路 解决方法 总结 在处理图像和视频等计算机视觉任务时&#xff0c;OpenCV是一个非常强大的库。然而…

数据库:存储、管理和分析数据的基石——数据库的介绍,分类,作用和特点

引言&#xff1a; 在现代信息时代&#xff0c;数据的管理和存储成为各个领域中不可或缺的一部分。数据库技术应运而生&#xff0c;它提供了一种结构化方式来组织、存储和管理数据。本文将详细介绍数据库的概念&#xff0c;并对常见的数据库进行分类&#xff0c;探讨它们的作用、…

图像处理之《隐写网络的隐写术》论文阅读

一、文章摘要 隐写术是一种在双方之间进行秘密通信的技术。随着深度神经网络(DNN)的快速发展&#xff0c;近年来越来越多的隐写网络被提出&#xff0c;并显示出良好的性能。与传统的手工隐写工具不同&#xff0c;隐写网络的规模相对较大。如何在公共信道上秘密传输隐写网络引起…

Linux colrm命令教程:如何移除文本文件中的指定列(附实例详解和注意事项)

Linux colrm命令介绍 colrm&#xff08;column remove&#xff09;命令在Linux中用于编辑源代码文件、脚本文件或常规文本文件中的文本。此命令可以从文件中移除选定的列。在这里&#xff0c;列被定义为一行中的单个字符。它始终从索引1开始&#xff0c;而不是0。 Linux colr…

anomalib1.0学习纪实-续2:三个文件夹

为了读懂程序&#xff0c;有三个最重要的文件夹&#xff0c;如下图&#xff1a; 正好对应四个类&#xff0c;如下图&#xff1a; 三个类的来源如下图所示&#xff1a; 注意&#xff0c;MVTec是个大类&#xff0c;里面用到了这里的第四个类MVTecDataset&#xff0c;代码如下。…

如何优雅地与ChatGPT对话?

ChatGPT已经发布了一年之久了&#xff0c;但你真的会使用ChatGPT吗&#xff1f;同一个问题&#xff0c;不同的问法得到的答案可能千差万别&#xff0c;你可以把ChatGPT当作一个知识面很广的专家&#xff0c;他上知天文下知地理&#xff0c;但他无法直接知道你的意图&#xff0c…

洛谷: P1553 数字反转(升级版)

思路: 没想到什么好办法&#xff0c;一步一步来。整体就是反转&#xff0c;删除前导/后导0&#xff0c;反转&#xff0c;删除前导/后导0。 第一次AC没过去&#xff0c;原因是没考虑到分数的分母前导0的情况&#xff0c;比如1234567890/1234567890这个样例&#xff0c;结果输出…

蓝桥杯官网填空题(寻找整数)

问题描述 本题为填空题&#xff0c;只需要算出结果后&#xff0c;在代码中使用输出语句将所填结果输出即可。 有一个不超过 10^17 的正整数 n&#xff0c;知道这个数除以 2 至 49 后的余数如下表所示&#xff0c;求这个正整数最小是多少。 运行限制 最大运行时间&#xff1a;…

AutoSAR(基础入门篇)10.6-模式管理进阶

目录 一、概念 1、Mode Requester(MRqr) 2、Mode User(MUsr) 3、Mode Manager(MMgr) 4、Mode Declaration Group 5、Mode Switch Event 二、总结

【软考问题】-- 10 - 知识精讲 - 项目风险管理

一、基本问题 1&#xff1a;按照可预测性&#xff0c;风险分哪三类&#xff1f; &#xff08;1&#xff09;已知风险&#xff1a;如项目目标不明确&#xff0c; 过分乐观的进度计划&#xff0c; 设计或施工变更和材料价格波动等。&#xff08;2&#xff09;可预测风险&#xff…

RSA后端加密,解密,加签及验签

目录 1.说明 2.加密和加签的区别 3.示例 4.注意事项 1.说明 RSA算法是一种非对称加密算法&#xff0c;与对称加密算法不同的是,RSA算法有两个不同的密钥,一个是公钥,一个是私钥。 公钥是公开的&#xff0c;可以多人持有&#xff1b;私钥是保密的&#xff0c;只有自己持有。…

智慧城市与数字孪生:实现城市可持续发展的关键

一、引言 随着全球城市化进程的加速&#xff0c;城市面临着诸多挑战&#xff0c;如资源紧张、环境恶化、交通拥堵等。为了解决这些问题&#xff0c;智慧城市的概念应运而生。智慧城市利用先进的信息通信技术&#xff0c;提升城市治理水平&#xff0c;改善市民的生活质量。而数…

macOS 上从源码安装 Nginx

在 macOS 上从源码安装 Nginx 并带上 --with-ipv6 参数进行编译&#xff0c;你可以按照以下步骤操作&#xff1a; 1. 安装依赖 首先&#xff0c;安装 Nginx 编译所需的依赖项。对于 macOS&#xff0c;你可能需要使用 Homebrew 来安装这些依赖项&#xff1a; bash复制代码 br…

Java ArrayDeque源码剖析

LinkedList实现了队列接口Queue和双端队列接口Deque,Java容器类中还有一个双端队列的实现类ArrayDeque,它是基于数组实现的。我们知道&#xff0c;一般而言&#xff0c;由于需要移动元素&#xff0c;数组的插入和删除效率比较低&#xff0c;但ArrayDeque的效率却非常高&#xf…

深度学习基础之《TensorFlow框架(5)—会话》

一、会话 2.x版本由于是即时执行模式&#xff0c;所以不需要会话。但是可以手工开启会话 1、什么是会话 一个运行TensorFlow operation的类。会话包含以下两种开启方式 &#xff08;1&#xff09;tf.compat.v1.Session&#xff1a;用于完整的程序当中 &#xff08;2&#xff…

微服务部署:金丝雀发布、蓝绿发布和滚动发布的对比

金丝雀发布、蓝绿发布和滚动发布的对比 金丝雀发布、蓝绿发布和滚动发布都是软件发布策略&#xff0c;它们都旨在降低发布风险并提高发布速度。但是&#xff0c;这三种策略在工作方式、优缺点等方面存在一些差异。 工作方式 金丝雀发布&#xff1a;将新版本软件逐步发布给用…