已知一颗二叉树按顺序存储结构进行存储,设计一个算法,求编号分别为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