利用顺序存储(数组)存储一棵完全二叉树,输出第i个数据元素的双亲和孩子

核心代码

if(temp==-1)
		printf("无结点\n");
	else if(temp==1)
		printf("无双亲\n");
	else
		printf("编号为%d为双亲\n",temp/2);
		
	if(2*temp>l)
			printf("无左孩子\n");
		else if(2*temp<=l)
			printf("左孩子为:%d\n",a[2*temp]);

	if((2*temp+1)>l)
			printf("无右孩子\n");
		else if((2*temp+1)<=l)
			printf("右孩子为:%d\n",a[2*temp+1]);
		else
			printf("wrong");

根据完全二叉树的定义
所有代码

#include<stdio.h>
#define MAX 10
int main()
{
	int a[MAX]={-1};
	int i=0;
	int temp;		//节点编号
	int l=0;
	do
	{
		i++;
		printf("请输入第%d个结点的值,若无为-1:",i);
		scanf("%d",&a[i]);
	}
	while(a[i]!=-1);		//输入二叉树
	for(i=1;a[i]!=-1;i++)
		{printf("第%d个节点值为:%d\n",i,a[i]);	l=i;}//输出二叉树,并统计个数
	printf("length:%d\n",l);	//输出二叉树节点个数
	printf("请输入要查找节点编号:");
	scanf("%d",&temp);
	if(temp==-1)
		printf("无结点\n");
	else if(temp==1)
		printf("无双亲\n");
	else
		printf("编号为%d为双亲\n",temp/2);
		
	if(2*temp>l)
			printf("无左孩子\n");
		else if(2*temp<=l)
			printf("左孩子为:%d\n",a[2*temp]);

	if((2*temp+1)>l)
			printf("无右孩子\n");
		else if((2*temp+1)<=l)
			printf("右孩子为:%d\n",a[2*temp+1]);
		else
			printf("wrong");
}

看完点赞!!!

算法如下: 1. 初始化二叉链表LT和顺序表ST,分别用指针和数组表示。 2. 如果ST为空,则返回空链表。 3. 从ST的第一个元素开始遍历,对于每个元素,先将其存入新建的二叉树结点中。 4. 如果该结点是根节点,则直接将其插入到LT中。 5. 否则,找到该结点的双亲结点p,将该结点作为p的左孩子或右孩子插入到LT中。 6. 重复步骤3-5,直到遍历完ST中所有元素。 7. 返回二叉链表LT。 算法描述中用到了二叉树结点的双亲结点,因此需要先定义一个二叉树结点的数据类型,包含数据元素、左孩子指针、右孩子指针和双亲结点指针。具体实现代码如下: ``` typedef struct BiTNode { ElemType data; // 数据元素 struct BiTNode *lchild, *rchild, *parent; // 左孩子、右孩子双亲结点指针 } BiTNode, *BiTree; // 初始化二叉链表LT和顺序表ST BiTree LT = NULL; ElemType ST[MAXSIZE]; // 建立二叉链表LT void CreateBiTree(BiTree &T, int i) { if (ST[i] == NULL) { T = NULL; } else { T = (BiTree)malloc(sizeof(BiTNode)); T->data = ST[i]; CreateBiTree(T->lchild, 2 * i); // 左孩子结点在数组中的下标为 2i CreateBiTree(T->rchild, 2 * i + 1); // 右孩子结点在数组中的下标为 2i+1 if (T->lchild != NULL) { T->lchild->parent = T; // 左孩子结点的双亲结点为 T } if (T->rchild != NULL) { T->rchild->parent = T; // 右孩子结点的双亲结点为 T } } } // 主函数 int main() { // 读入顺序表ST和最后一个元素的下标last int last; scanf("%d", &last); for (int i = 1; i <= last; i++) { scanf("%d", &ST[i]); } // 建立二叉链表LT CreateBiTree(LT, 1); // 输出二叉链表LT printf("二叉链表LT:\n"); PrintBiTree(LT, 0); return 0; } ``` 其中,CreateBiTree函数用于建立二叉链表LT,PrintBiTree函数用于输出二叉链表LT,具体实现代码见下: ``` // 输出二叉链表LT void PrintBiTree(BiTree T, int depth) { if (T == NULL) { return; } // 先输出右子树 PrintBiTree(T->rchild, depth + 1); // 再输出根节点 for (int i = 0; i < depth; i++) { printf(" "); } printf("%d\n", T->data); // 最后输出左子树 PrintBiTree(T->lchild, depth + 1); } ``` 这样,就可以通过顺序表ST构建二叉链表LT了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值