龙空技术网

信息学奥赛一本通数据结构,树的概念

黑猫编程 207

前言:

此刻咱们对“数据结构中树的度是什么意思”大致比较珍视,姐妹们都需要学习一些“数据结构中树的度是什么意思”的相关知识。那么小编同时在网上搜集了一些对于“数据结构中树的度是什么意思””的相关知识,希望兄弟们能喜欢,各位老铁们一起来了解一下吧!

什么是树形结构?

在现实生活中有很多体现树的逻辑的例子,比如企业里的职级关系,就是一个

树的定义

对于树的定义还需要注意两点:

1.n>0 时,根结点是唯一的,不可能存在多个根结点

​ 2.m>0 时,子树的个数没有限制,但它们一定是互不相交的。如图中的两个结构就不符合树的定义,因为它们都有相交的子树

树的相关概念

根结点

例:A

分支结点:度不为 0 的结点

例:A B D F

叶子:度为 0 的结点

例:E J G H I C

孩子:一个结点子树的根

例:G H I 是 D 的孩子

双亲:如果 B 是 A 的孩子,那么 A 是 B 的双亲

例:D 是 G H I 的双亲

兄弟:同一双亲的孩子间互称兄弟

例:G H I 互为兄弟

祖先:从根到某个结点所经过的分支上的所有结点称为该结点的祖先

例:J 的祖先有:A B F

子孙:某结点子树中所有结点都是该结点的子孙 例:B 的子孙有 E F J

**度指的是一个结点的子结点的数量,一 棵树的度是指树中最大的结点度**

例:结点 B 的度为 2,结点 D 的度为 3,树的度为 3。

课堂例题找树根和孩子

题目解析:

1.tr[y] = x 表示 y 的双亲结点为 x。

2.由于结点编号未必连续,因此每出现一个结点都需要标记。

3.mp[x] 记录 x 的子结点数量。

参考程序:

#include <iostream>#include <map>using namespace std;const int N = 110;int n, m;int tr[N];bool book[N];map<int, int> mp;int main() {    cin >> n >> m;    while(m--){        int x, y;        cin >> x >> y;        tr[y] = x;        mp[x]++;        book[x] = true;        book[y] = true;    }    for(int i = 1;  i < N; i++){        if(tr[i] == 0 && book[i]){            cout << i << endl;            break;        }    }       int cnt = -1, p = -1;    for(auto x: mp){        if(x.second > cnt){            cnt = x.second;            p = x.first;        }    }    cout << p << endl;    for(int i = 1; i < N; i++)        if(tr[i] == p)            cout << i << " ";    return 0;}
单词查找树

题目解析:

首先要对建树的过程有一个了解。对于当前被处理的单词和当前树:在根结点的子结点中找单词的第一位字母,若存在则进而在该结点的子结点中寻找第二位……

如此下去直到单词结束,即不需要在该树中添加结点;或单词的第 n 位不能被找到,即将单词的第 n 位及其后的字母依次加入单词查找树中去。

**但,本问题只是问你结点总数,而非建树方案,且有 32K 文件,可以考虑能不能不通过建树就直接算出结点数?**

为了说明问题的本质,我们给出一个定义:一个单词相对于另一个单词的差:设单词 2 的长度为 L,且与单词 1 从第 N 位开始不一致,则说单词 2 相对于单词 1 的差为 L-N+1,这是描述单词相似程度的量。

可见,将一个单词加入单词树的时候,须加入的结点数等于该单词树中与已有单词的差的最小值。

单词的字典顺序排列后的序列则具有类似的特性,即在一个字典顺序序列中,第 m 个单词相对于第 m-1 个单词的差必定是它对于前 m-1 个单词的差中最小的。于是,得出建树的等效算法:

① 读入数据;

② 对单词列表进行字典顺序排序;

③ 依次计算每个单词对前一单词的差,并把差累加起来。注意:第一个单词相对于的差为该单词的长度;

累加和再加上1(根结点),输出结果。

就给定的样例,按照这个算法求结点数的过程如下表:

数据结构:

先确定 32K(32*1024=32768字节)的文件最多有多少单词和字母。当然应该尽可能地存放较短的单词。

因为单词不重复,所以长度为 1 的单词(单个字母)最多26个;

长度为2的单词最多为26*26=676个;因为每个单词后都要一个换行符(换行符在计算机中占 2 个字节),所以总共已经占用的空间为:(1+2)*26+(2+2)* 676=2782 字节;

剩余字节(32768-2782=29986字节)分配给长度为 3 的单词(长度为 3 的单词最多有 26*26*26=17576个)有 29986/(3+2)≈ 5997。

所以单词数量最多为 26+676+5997=6699。

定义一个数组:string words[7000];把所有单词连续存放起来,用选 sort 进行排序。

参考程序:

#include <iostream>#include <string>#include <algorithm>using namespace std;string words[7000];int n = 1;int main() {    while(cin >> words[n++]);    n--;    sort(words + 1, words + n + 1);    int res = words[1].size();    for(int i = 2; i <= n; i++){        int j = 0;        while(j < words[i - 1].size()){            if(words[i][j] != words[i - 1][j])                break;            j++;        }        res += words[i].size() - j;    }    cout << res + 1 << endl;    return 0;}

标签: #数据结构中树的度是什么意思