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;//深度+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.拓展:二叉查找树

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

例:
file

5.推荐题目

posted @ 2026-07-30 15:50  _wyt001  阅读(16)  评论(0)    收藏  举报