基本树

· · 个人记录

1. 什么是树

树是一种特殊的图,它是一种 n 个点,n-1 条边,没有环和重边的一种特殊的图。你可以将它倒过来看。
生活中的树:


图中的树:

2. 有根树、无根树

一个没有固定根结点的树称为无根树;在无根树的基础上,指定一个结点称为,则形成一棵有根树。一般来说,我们用 1 来表示无根树的根。

3. 一些其他的树

4. 树的组成

5. 一些特殊的树

6. 二叉树的存储

7. k 叉树的存储

由于树是特殊的图,所以我们可以用邻接表来存一棵树。具体存法详见基本图论的第 7 节。
这下有人就要问了,为什么不用邻接矩阵?
邻接矩阵存稀疏图太浪费空间,而树只有 n-1 条边,肯定是一张稀疏图。
对于一些特殊的题目,只需要存父亲。

8. 树上DFS

树上DFS模板:

void dfs(int x,int last)
{
        for(int i=0;i<a[i].size();i++)
        {
            int u=a[x][i];
            if(u==last) continue;
            ...
            dfs(u,x);
            ...
        }
}

接下来分析一下:

9. 树上BFS

树上BFS模板:

struct node{
        int x,last;
};
...
q.push(node{根节点编号,-1});
while(!q.empty())
{
        node u=q.front();q.pop();
        ...
        for(int i=0;i<a[u.x].size();i++)
        {
            int v=a[u.x][i];
            if(u.last==v) continue;
            ...
            q.push({v,u.last});
            ...
        }
        ...
}

同理:

10. 二叉树的遍历