当前位置: 首页 > news >正文

c++里的族谱:树

1.引入

Q\(_1\): 树在C++里是什么?

A\(_1\) 就是描述一对多关系的数据结构。

Q\(_2\) C++里的树,跟实际生活有什么关系?

A\(_2\) 就是你家的族谱。一个根,往下分叉出子孙,层层往下,C++的树与这是完全一样的

2.什么是树

2.1树的要素

  • 父子: 树的上层和下层是父子关系

  • 根: 树最顶上的元素(没有父节点)

  • 子树: 树中任何一个节点,连同它下面的所有后代,都可以构成一棵子树

2.2不同的树

2.2.1二叉树

2.2.1.1二叉树的定义

二叉树是\(n(n≥0)\)个节点的有限集合,该集合要么为空(称为空二叉树),要么由一个根节点和两棵互不相交的二叉树组成(一般称为左子树和右子树)。

2.2.1.2二叉树长什么样?

file

2.2.1.3满二叉树

定义: 每个节点要么没有孩子,要么正好有两个孩子。

file

2.2.1.4完全二叉树

定义: 除了最后一层可以不满,其他层必须排满,而且最后一层的节点必须从左往右连续排列,中间不能有空位。

95fc6374c8e64db0af5d7b92405f86b8.jpeg~tplv-a9rns2rl98-ds_wm_1_6_dk

2.2.2多叉树

  • 有且仅有一个根节点(n=0 时为空树)。

  • 除根节点外,每个节点有且仅有一个父节点。

  • 每个节点可以有 0 到 m(m≥3) 个子节点,且子节点之间 无序或有序(有序多叉树也叫 m 叉树)。

3.树的代码实现

3.1二叉树版

#include<bits/stdc++.h>
using namespace std;
int n;//树的节点数
vector<int>e[1000005];//e用于记录节点的子节点
void dfs1(int now) {//前序遍历:按照 根,左子树,右子树 的顺序遍历cout<<now<<" ";//输出根for(int i:e[now]) {//枚举子节点if(i==0) continue;dfs1(i);//递归}return ;
}
void dfs2(int now) {//中序遍历:按照 左子树,根,右子树 的顺序遍历int a=e[now].front(),b=e[now].back();//a,b  为子节点编号if(a!=0) dfs2(a);//递归cout<<now<<" ";//输出根if(b!=0) dfs2(b);return ;
} 
void dfs3(int now) {//后序遍历:按照 左子树,右子树,根 的顺序遍历for(int i:e[now]) {//枚举子节点if(i==0) continue;//特判dfs3(i);//递归}cout<<now<<" ";//输出根return ;
}
int main() {cin>>n;//输入节点数量for(int i=1;i<=n;i++) {int u,v;cin>>u>>v;e[i].push_back(u);e[i].push_back(v);}dfs1(1);//前序cout<<endl;dfs2(1);//中序cout<<endl;dfs3(1);//后序cout<<endl;return 0;
}

输入 1:

7
2 7
4 0
0 0
0 3
0 0
0 5
6 0

输出 1:

1 2 4 3 7 6 5
4 3 2 1 6 5 7
3 4 2 5 6 7 1

3.2多叉树版

#include<bits/stdc++.h>
using namespace std;
int n,m;//n为节点数,m为边的数量
vector<int>e[100005];//e存储每个点的父节点和子节点
int dep[100005];//存储每个点的深度(距离根的距离)
int maxx=0;//最远距离(树的深度)
void dfs(int now,int fa) {//递归,now表示当前节点,fa表示当前节点的父节点dep[now]=dep[fa]+1;//深度+1maxx=max(maxx,dep[now]);//记录最大深度for(int i:e[now]) {//枚举子节点if(i==fa) continue;//特判dfs(i,now);//递归}
}
int main() {cin>>n>>m;//输入for(int i=1;i<=m;i++) {int u,v;cin>>u>>v;//u,v表示两个节点e[u].push_back(v);e[v].push_back(u);}dep[0]=0;//初始化dfs(1,0);//默认1的父节点为0cout<<maxx;//输出return 0;
}

4.拓展:二叉查找树

定义: \(左子树所有节点的值 < 根节点的值 < 右子树所有节点的值\),其余与二叉树相同

例:
file

5.推荐题目

  • B3642 二叉树的遍历

  • P4913 【深基16.例3】二叉树深度

  • P1827 [USACO3.4] 美国血统 American Heritage

  • P1305 新二叉树

  • P1030 [NOIP 2001 普及组] 求先序排列

  • P1229 遍历问题

  • P5076 【深基16.例7】普通二叉树(简化版)

http://www.jsqmd.com/news/1294712/

相关文章:

  • Java 8 Stream 三种对象属性去重方案详解与实战对比
  • 从手动到自动:工程师思维转变的方法论
  • LE5010低功耗蓝牙开发实战:从环境搭建到量产避坑指南
  • 如何完整备份你的QQ空间记忆:GetQzonehistory免费开源工具指南
  • 【独家泄露】头部SaaS公司AI定价黑箱参数表(含弹性系数阈值、竞对敏感度权重、实时调价熔断机制)
  • 2026湖北刻度律师事务所电话联系方式全渠道汇总 - 资讯在线
  • WeChatExporter终极指南:3步轻松备份微信聊天记录到电脑永久保存
  • PyTorch分布式训练数据加载优化:DataLoader调优与WebDataset实战
  • Minimum Size Subarray Sum:从 O(n²) 暴力到 O(n) 滑动窗口,我只改了 4 行
  • 长期更新软件:注册无广告WinRaR.v7.23压缩解压工具_二合一美化版
  • 5秒搞定麦克风静音:MicMute让你的Windows音频控制从未如此简单
  • 在Obsidian中一键导出PDF、Word和ePub:终极Pandoc插件完整指南
  • 终极免费AI音频增强教程:5分钟让你的语音清晰如新
  • 青少年离焦镜片选购指南:哪些品牌技术更扎实? 哪款更值得入手? - 探词产品观测室
  • LangChain 1.x升级指南:init_chat_model新特性解析
  • Unity开发必知:dataPath、streamingAssetsPath与persistentDataPath核心解析与实战指南
  • CTF应急响应实战:从流量分析到内存取证的综合安全能力训练
  • 基因载体全解析:从染色体结构到人工载体的生物技术应用
  • bit-bang时序被编译器优化破坏了怎么办
  • 用了“盖州德溢”才发现名声大也有不足?
  • 终端音频可视化神器:CAVA 让你的命令行随音乐起舞 [特殊字符]
  • 苏州帮制造业出海推荐服务公司怎么选?看这四点就够了 - GrowthUME
  • 代码题练习
  • 华为OD机试TLV解码:从协议原理到多语言实现详解
  • AI如何提升学术写作效率:智能框架与文献处理
  • ESP32 Arduino Core安装失败全解析:从网络问题到手动安装的终极解决方案
  • 2026河源美缝价格表|河源美缝哪家好?收费标准与避坑推荐 - GrowthUME
  • 光伏紧固件耐候性技术体系解析 江苏虎跃 30 年寿命保障底层逻辑
  • 嵌入式项目文档三件套——规则、清单、待办
  • 高速PCB设计中的绕等长:原理、实战与Altium Designer技巧