
//sequenceTree.cpp/* 采用顺序存储保存一个二叉树,我们要将一个普通的树转换成一颗完全二叉树,将不存在的节点用9999代替*/#define _CRT_SECURE_NO_WARNINGS#include <stdio.h>#include <stdlib.h>void createBiTree(int *arr,int count) { int i = 1,data; //int *arr = (int *)malloc(sizeof(int)*(count+2));//下标为0我们不存,最后要有结束标识符 while (count--) { printf("请输入第%d个节点:",i); scanf("%d",&data); *(arr + i) = data; i++; }}
/* 已知一课二叉树按顺序存储结构进行存储,设计一个算法,求编号分别为i和j的两个节点的最近的公共祖先节点的值 分析: 利用数组存储一颗二叉树,一般来说我们用这种方式存储一颗完全二叉树,不浪费空间*/#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);}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;}