设有广义表:A=(C, E, F), C=(a, D), D=(c, d, e), E=(b, g), F=(D, f)。 1) 画出A的链式存储结构; 2) 求各表的长度和深度。
时间: 2024-10-08 20:25:29 浏览: 64
1) 广义表 A 的链式存储结构可以按照层次关系来表示。首先,根节点 A 存储的是元素 (C, E, F),接着分别代表 C、E 和 F 的链接。对于 C 节点,它包含 a 和 D;D 节点又有 c、d 和 e。同样,F 节点引用了 D 节点和 f。我们可以用箭头表示这种链接关系:
```
A
/ \
C E
/ \ / \
a D b g
| / \
| c D'
| / \
| d f
```
这里 `D'` 表示 F 中对 D 的引用,因为实际的 D 节点包含了额外的信息。
2) 各表的长度和深度计算如下:
- A 的长度:5(因为它有5个元素)
- A 的深度:1(作为最外层列表)
- C 的长度:2(因为有 a 和 D 两个元素)
- D 的深度:2(因为嵌套了一次)
- E 的长度:2(b 和 g)
- E 的深度:1
- F 的长度:3(D、f 加上一个指向 D 的引用)
- F 的深度:2
综上所述:
- A 长度:5,深度:1
- C 长度:2,深度:1
- D 长度:4,深度:2
- E 长度:2,深度:1
- F 长度:3,深度:2
相关问题
设一棵树的广义表表示法为:A(B(E,F),C(G),D(H,I(K)J)), 试求: ①请画出该树对应的二叉树;(4 分) ②给出对应二叉树的先根遍历结果、中根遍历结果、后根遍历结 果(6 分)
首先,让我们来分析这个广义表表示的树:
A(B(E,F),C(G),D(H(I(K)J)))
这棵树描述了一个有五个节点的结构,其中A是根节点,B、C、D是其左孩子,E、F是B的孩子,G是C的孩子,H是D的孩子,I和K是H的孩子,而J是I的孩子。
### ① 二叉树的构造
将这个树转换成二叉树,我们通常会按照从左到右、自顶向下的顺序来构建。首先创建根节点A,然后依次添加它的两个直接子节点B和C。接着对于B,它有两个子节点E和F,我们将E放在B的左侧,F放在右侧。同样地,对C添加G,对D添加H,再将I放在H的左侧和K放在右侧,最后将J放在I的右侧。下面是该树转化为二叉树的结果(由于文字无法直接展示图形,你可以尝试想象一个层次分明的结构):
```
A
/ \
B C
/ \ \
E F G
/ \
H I
/ \
J K
```
### ② 先序遍历、中序遍历和后序遍历
- **先根遍历**(Preorder Traversal): A -> B -> E -> F -> C -> G -> D -> H -> I -> J -> K
- **中序遍历**(Inorder Traversal): E -> B -> F -> D -> H -> I -> J -> K -> A -> C
- **后根遍历**(Postorder Traversal): E -> F -> B -> I -> J -> H -> K -> D -> G -> C -> A
注意:这里的遍历结果假设我们遵循的是常规的二叉树遍历规则,即先访问根节点,然后递归遍历左子树,最后递归遍历右子树。
任务1、假设稀疏矩阵A和B均以三元组顺序表作为存储结构。试写出矩阵相加的算法,另设三元组表C存放结果矩阵。 任务2、有广义表如下所示,A = (a , b ,(c , d),(e , (f , g))),请画出它的孩子兄弟链表。 任务3、基于堆分配存储结构,试设计算法,实现从串S中删除第pos个字符起长度为len的子串,函数声明如下: Status StrDelete(HString &S,int pos,int len)//从串S中删除第pos个字符起长度为len的子串。
1.稀疏矩阵相加算法:
```
void SparseMatrixAdd(TSMatrix A, TSMatrix B, TSMatrix& C) {
if (A.mu != B.mu || A.nu != B.nu) {
printf("Error: two matrices have different dimensions.\n");
return;
}
int pa = 1, pb = 1, pc = 1;
while (pa <= A.tu && pb <= B.tu) {
if (A.data[pa].i < B.data[pb].i || (A.data[pa].i == B.data[pb].i && A.data[pa].j < B.data[pb].j)) {
C.data[pc] = A.data[pa];
pa++; pc++;
} else if (A.data[pa].i > B.data[pb].i || (A.data[pa].i == B.data[pb].i && A.data[pa].j > B.data[pb].j)) {
C.data[pc] = B.data[pb];
pb++; pc++;
} else {
if (A.data[pa].e + B.data[pb].e != 0) {
C.data[pc].i = A.data[pa].i;
C.data[pc].j = A.data[pa].j;
C.data[pc].e = A.data[pa].e + B.data[pb].e;
pc++;
}
pa++; pb++;
}
}
while (pa <= A.tu) {
C.data[pc] = A.data[pa];
pa++; pc++;
}
while (pb <= B.tu) {
C.data[pc] = B.data[pb];
pb++; pc++;
}
C.mu = A.mu;
C.nu = A.nu;
C.tu = pc - 1;
}
```
2. 广义表A的孩子兄弟链表:
```
A
/ \
a b
/ \
c d
/ \
e f
\
g
孩子兄弟链表:
A--a--b--c--e--f--g--d
```
3. 从串S中删除第pos个字符起长度为len的子串的算法:
```
Status StrDelete(HString &S, int pos, int len) {
if (pos < 1 || pos > S.length || len < 0 || pos + len - 1 > S.length) {
return ERROR;
}
if (len == 0) {
return OK;
}
int i = pos + len - 1;
while (i < S.length) {
S.ch[pos - 1] = S.ch[i];
pos++; i++;
}
S.ch[S.length - len] = '\0';
S.length -= len;
return OK;
}
```
阅读全文