【数据结构周周练】007顺序结构实现完全二叉树操作- 求编号i与j最近公共祖先结点
原创
©著作权归作者所有:来自51CTO博客作者水亦心824的原创作品,请联系作者获取转载授权,否则将追究法律责任
树型结构是数据结构中学到的第一个一对多的结构,是非常重要的非线性结构,也是比较难的一个结构,由于一叉树是顺序表,三叉树比较复杂,最常用的是二叉树。从这次开始就带领大家走进树的世界。
目录
一、题目
二、代码实现
三、运行结果
注意:
1、树的相关术语也比较多,操作也比较多,在这里,我只写了该次练习所用到的操作及相近操作。后续的树的练习还会不断完善。
2、本次实现的树的代码与书上讲的代码差距比较大,完全根据自己对树的理论理解写的代码。以树的顺序结构实现的定义为例,严蔚敏老师的书上的定义是:
#define MAX_TREE_SIZE 100
int SqBiTree[MAX_TREE_SIZE]; //数据结构书中二叉树的定义
而我自己的定义是:
typedef struct {
int *treeBase;
int elemNum;
int treeSize;
}SqBiTree;
如果大家有其他定义方式,希望大家能够积极评论。
一、题目
已知一棵顺序二叉树有20个数据,求编号分别为 i、j 的两个结点最近的公共祖先结点的编号及当前结点的值(结点赋值为编号值,但要通过结点获取)。
二、代码实现
#define MAX_TREE_SIZE 20
#include<iostream>
#include<malloc.h>
using namespace std;
//int SqBiTree[MAX_TREE_SIZE];//数据结构书中二叉树的定义
typedef struct {
int *treeBase;
int elemNum;
int treeSize;
}SqBiTree;
int InitBiTree(SqBiTree &T) {
T.treeBase = (int *)malloc(MAX_TREE_SIZE * sizeof(SqBiTree));
if (!T.treeBase)
{
cout << "空间分配失败" << endl;
exit(OVERFLOW);
}
T.elemNum = 0;
T.treeSize = MAX_TREE_SIZE;
return 1;
}
int CreatBiTree(SqBiTree &T,int e) {
if (T.elemNum == T.treeSize)
{
cout << "树已满" << endl;
exit(OVERFLOW);
}
T.treeBase[T.elemNum] = e;
T.elemNum++;
return 1;
}
int ParentNum(SqBiTree &T, int childNum) {
return (childNum -1) / 2;
}
int LChildNum(SqBiTree &T, int parentNum) {
return parentNum * 2 + 1;
}
int RChildNum(SqBiTree &T, int parentNum) {
return (parentNum + 1) * 2;
}
int ElemLayer(SqBiTree &T, int num) {
int layar = 0;
while (num)
{
num = (num - 1) / 2;
layar++;
}
return layar;
}
void main() {
int i = 7;
int j = 18;
SqBiTree T;
InitBiTree(T);
for (int k = 0; k < 20; k++)
{
CreatBiTree(T, k);
}
while (i != j)
{
if (ElemLayer(T, i)>ElemLayer(T, j))
i = ParentNum(T, i);
else if (ElemLayer(T, i)<ElemLayer(T, j))
j = ParentNum(T, j);
else
{
i = ParentNum(T, i);
j = ParentNum(T, j);
}
}
cout << "距离i 与 j 最近的公共祖先的编号是:" << i << endl;
cout << "该编号对应的值为:" << T.treeBase[i] << endl;
}
三、运行结果