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二叉树长什么样?

2.2.1.3满二叉树

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

2.2.1.4完全二叉树

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

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;//深度+1
    maxx=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的父节点为0
    cout<<maxx;//输出
    return 0;
}

4.拓展:二叉查找树

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

例:

5.推荐题目

相关推荐
神仙别闹2 小时前
基于 C++ 实现两个有序链表序列的交集
java·c++·链表
hansang_IR4 小时前
【题解】[APIO2023] 赛博乐园 / cyberland
c++·算法·图论
落羽的落羽5 小时前
【AI】快速理解AI应用的相关名词概念
linux·c++·人工智能·python·计算机网络·算法
刚入门的大一新生5 小时前
Linux-进程控制
linux·运维·服务器·c++
刃神太酷啦5 小时前
Redis 进阶核心:持久化 (RDB/AOF)、事务与主从复制全解析----《Hello Redis!》(5)
linux·c语言·数据库·c++·redis·缓存·bootstrap
喜欢吃燃面8 小时前
深入 C++ STL:从 unordered_set与unordered_map到底层哈希表的原理与实现
数据结构·c++·散列表
FlightYe9 小时前
音视频修炼之基础理论(五):AAC格式与解析
android·linux·c++·音视频·aac
ShineWinsu9 小时前
对于MySQL:数据库的操作的解析
linux·数据库·c++·mysql·面试·笔试·库的操作
云小逸10 小时前
C++ 第一阶段:对象、内存与生命周期
开发语言·c++
夜航海图10 小时前
S-57 数据解剖:把一个 ENC 文件拆给你看
c++