树——第1题

已知一颗二叉树按顺序存储结构进行存储,设计一个算法,求编号分别为i和j的两个节点的最近的公共祖先节点的值。

知识回顾:树的顺序存储,即存储在数组中,下标0不存,下标i的双亲下标为i/2向下取整,左孩子为2i,右孩子为2i+1。

代码一:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>

int findCommonAncestor(int *arr,int i,int j) {
	while (i!=j) {
		(i > j) ? (i = i / 2):(j = j / 2);
	}
	return *(arr + i); //return arr[i];
}

int main() {
    int arr[]={0,1,2,3,0,0,4,0}; 
	int count = findCommonAncestor(arr,2,3);
	printf("公共祖先的值为:%d",count);
	return 0;
}

运行结果:

公共祖先的值为:1

代码2:

#include <stdio.h>

void createBiTree(int *arr,int count) {
	int i = 1,data;
	while (count--) {
		printf("请输入第%d个节点:",i);
		scanf("%d",&data);
		*(arr + i) = data;
		i++;
	}
}

int findCommonAncestor(int *arr,int i,int j) {
	while (i!=j) {
		i > j ? (i = i / 2):(j = j / 2);
	}
	return *(arr + i);
}

int main() {
	void createBiTree(int *,int);
	int count,i,j;
	printf("请输入所要创建的二叉树,其转换为完全二叉树的最少节点数:count=");
	scanf("%d",&count);
	int *arr = (int *)malloc(sizeof(int)*(count + 2));//下标为0我们不存
	createBiTree(arr,count);
	printf("请输入要查找公共节点的两个节点的编号,编号<=%d:\n",count);
	printf("i=");
	scanf("%d",&i);
	printf("\n");
	printf("j=");
	scanf("%d", &j);
	while (i>count || j>count || *(arr+i)==9999||*(arr+j)==9999 ){
		printf("编号有误,请重新输入:\n");
		printf("i=");
		scanf("%d", &i);
		printf("\n");
		printf("j=");
		scanf("%d", &j);
	}
	count = findCommonAncestor(arr,i,j);
	printf("公共祖先的值为:%d",count);
	return 0;
}

运行结果:

请输入所要创建的二叉树,其转换为完全二叉树的最少节点数:count=11
请输入第1个节点:1
请输入第2个节点:2
请输入第3个节点:3
请输入第4个节点:4
请输入第5个节点:5
请输入第6个节点:9999
请输入第7个节点:7
请输入第8个节点:9999
请输入第9个节点:9999
请输入第10个节点:9999
请输入第11个节点:11
请输入要查找公共节点的两个节点的编号,编号<=11:
i=4

j=11
公共祖先的值为:2                                                                                                                
 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值