75.png

    1. //sequenceTree.cpp
    2. /*
    3. 采用顺序存储保存一个二叉树,我们要将一个普通的树转换成一颗完全二叉树,将不存在的节点用9999代替
    4. */
    5. #define _CRT_SECURE_NO_WARNINGS
    6. #include <stdio.h>
    7. #include <stdlib.h>
    8. void createBiTree(int *arr,int count) {
    9. int i = 1,data;
    10. //int *arr = (int *)malloc(sizeof(int)*(count+2));//下标为0我们不存,最后要有结束标识符
    11. while (count--) {
    12. printf("请输入第%d个节点:",i);
    13. scanf("%d",&data);
    14. *(arr + i) = data;
    15. i++;
    16. }
    17. }
    1. /*
    2. 已知一课二叉树按顺序存储结构进行存储,设计一个算法,求编号分别为i和j的两个节点的最近的公共祖先节点的值
    3. 分析:
    4. 利用数组存储一颗二叉树,一般来说我们用这种方式存储一颗完全二叉树,不浪费空间
    5. */
    6. #define _CRT_SECURE_NO_WARNINGS
    7. #include <stdio.h>
    8. #include <stdlib.h>
    9. int findCommonAncestor(int *arr,int i,int j) {
    10. while (i!=j) {
    11. i > j ? i = i / 2: j = j / 2;
    12. }
    13. return *(arr + i);
    14. }
    15. int main() {
    16. void createBiTree(int *,int);
    17. int count,i,j;
    18. printf("请输入所要创建的二叉树,其转换为完全二叉树的最少节点数:count=");
    19. scanf("%d",&count);
    20. int *arr = (int *)malloc(sizeof(int)*(count + 2));//下标为0我们不存
    21. createBiTree(arr,count);
    22. printf("请输入要查找公共节点的两个节点的编号,编号<=%d:\n",count);
    23. printf("i=");
    24. scanf("%d",&i);
    25. printf("\n");
    26. printf("j=");
    27. scanf("%d", &j);
    28. while (i>count || j>count || *(arr+i)==9999||*(arr+j)==9999 ){
    29. printf("编号有误,请重新输入:\n");
    30. printf("i=");
    31. scanf("%d", &i);
    32. printf("\n");
    33. printf("j=");
    34. scanf("%d", &j);
    35. }
    36. count = findCommonAncestor(arr,i,j);
    37. printf("公共祖先的值为:%d",count);
    38. return 0;
    39. }