假设以顺序表ST表示一棵完全二叉树,ST.data[ST.last]中存放二叉树中各结点的数据元素。试设计算法由此顺序存储结构建立该二叉树的二叉链表LT。
时间: 2024-04-30 13:18:02 浏览: 66
用顺序和二叉链表作存储结构实现二叉排序树全代码.doc
5星 · 资源好评率100%
假设完全二叉树的顺序存储结构为数组ST,该完全二叉树的根节点在数组中的下标为1,则可以按照以下步骤建立该二叉树的二叉链表LT:
1. 定义二叉树的存储结构:
```
typedef struct BiTNode {
ElemType data; // 数据元素
struct BiTNode *lchild; // 左子结点
struct BiTNode *rchild; // 右子结点
} BiTNode, *BiTree;
```
2. 初始化一个指针数组,指向每个结点的指针:
```
BiTree LT[MAXSIZE];
```
3. 从根节点开始,依次遍历顺序表ST中的所有结点,对每个结点创建一个二叉树结点,同时将该结点的指针存入指针数组LT中对应的位置:
```
for (int i = 1; i <= ST.last; i++) {
BiTree p = (BiTree)malloc(sizeof(BiTNode));
p->data = ST.data[i];
p->lchild = NULL;
p->rchild = NULL;
LT[i] = p;
}
```
4. 对于任意结点i,其左子结点的下标为2i,右子结点的下标为2i+1,如果该结点存在左子结点或右子结点,则将其指向相应的结点指针:
```
for (int i = 1; i <= ST.last; i++) {
if (i * 2 <= ST.last) {
LT[i]->lchild = LT[i * 2];
}
if (i * 2 + 1 <= ST.last) {
LT[i]->rchild = LT[i * 2 + 1];
}
}
```
5. 返回根节点的指针:
```
return LT[1];
```
完整代码如下:
```
typedef struct BiTNode {
ElemType data; // 数据元素
struct BiTNode *lchild; // 左子结点
struct BiTNode *rchild; // 右子结点
} BiTNode, *BiTree;
BiTree BuildTree(SeqList ST) {
BiTree LT[MAXSIZE];
for (int i = 1; i <= ST.last; i++) {
BiTree p = (BiTree)malloc(sizeof(BiTNode));
p->data = ST.data[i];
p->lchild = NULL;
p->rchild = NULL;
LT[i] = p;
}
for (int i = 1; i <= ST.last; i++) {
if (i * 2 <= ST.last) {
LT[i]->lchild = LT[i * 2];
}
if (i * 2 + 1 <= ST.last) {
LT[i]->rchild = LT[i * 2 + 1];
}
}
return LT[1];
}
```
阅读全文