c语言题目求解,急急急!

 

// 查找二叉树一个节点的堂兄弟 
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define initial_size 256

typedef int ElemType; // 二叉树节点数据类,整数。 

typedef struct {
  ElemType* elem; // 使用动态数组表示二叉树。 
    int capacity; // 二叉树最大节点容量。 
} BTree; // 定义二叉树类。 

// 初始化二叉树,假设二叉树节点数据是大于 0 的整数。
// 若节点数据为 0,则为空节点。 
void initial(BTree *bT) {
    int i;
    
    bT->elem = (ElemType *) malloc(sizeof(ElemType) * initial_size);
    bT->capacity = initial_size;
    for (i=0; i<initial_size; i++) bT->elem[i] = 0; // 所有节点都是空的。  
}

// 查找二叉树 bT 中的元素 e 的节点. 
int search(BTree bT, ElemType e) {
    int curr = 1; // 目前的二叉树元素的节点下标,1 是根节点。
    
    while (1) { // 继续查找直到找到节点或空节点。 
      if (bT.elem[curr]==0 || curr>=bT.capacity) return -1; // 查找失败。 
      else {
          if (bT.elem[curr]>e) curr = curr * 2; // 继续找左子树。 
          else if (bT.elem[curr]<e) curr = curr * 2 + 1; // 继续找右子树。
          else return curr; // 查找成功,返回目前节点的下标。
      }
    }
}

// 在二叉树 bT 中插入元素为 e 的节点。 
int insert(BTree *bT, ElemType e) {
    int curr = 1; // 目前的二叉树元素的节点下标,1 是根节点。
    int i;
    
    while (1) { // 继续插入操作直到插入成功或元素重复。
        if (bT->elem[curr]==0) { // 找到可插入的节点。 
          bT->elem[curr] = e; // 将元素置入目前节点。 
          return curr; // 返回目前节点的下标。 
        }
        if (bT->elem[curr]>e) curr = curr * 2; // 尝试左子树。 
        else if (bT->elem[curr]<e) curr = curr * 2 + 1; // 尝试右子树。 
        else { // 元素重复。 
            printf("\n**** 元素 %d 已存在节点 %d.\n", e, curr);
            return -1; // 插入失败。 
        }
        if (curr>=bT->capacity/2) { // 将树的高度长大 1. 
            bT->capacity = bT->capacity * 2;
            bT->elem = (ElemType *) realloc(bT->elem, bT->capacity*sizeof(ElemType)); // 扩张二叉树的节点容量。 
            for (i=bT->capacity/2; i<bT->capacity-1; i++) bT->elem[i] = 0; // 将新增的节点设为空节点。 
        }
    }
}

// 打印二叉树 bT,目前节点下标 inx, 目前节点层数。 
void printTree(BTree bT, int inx, int layer) {
  int i;

  if (bT.elem[inx]!=0) { // 目前的节点不是空节点。 
    printTree(bT, inx*2+1, layer+1); // 首先打印右子树。 
    for (i=0; i<layer; i++) printf("    "); // 打印目前节点前面的空格。 
    printf(" %3d\n", bT.elem[inx]); // 打印目前节点的元素。 
    printTree(bT, inx*2, layer+1); // 最后打印左子树。
  }
  else { // 目前的节点是空节点。
    for (i=0; i<layer; i++) printf("    "); // 目打印空节点前面的空格。
    printf(" ---\n"); // 打印空节点。.
  }
}

// 清除二叉树。 
void clearTree(BTree *bT) {
  int i;

  bT->elem = (ElemType *) realloc(bT->elem, sizeof(ElemType) * initial_size);
  bT->capacity = initial_size;
  for (i=0; i<initial_size; i++) bT->elem[i] = 0;
}

// 查找并打印节点数据为 e 的所有堂兄弟,返回堂兄弟个数。
int findCousins(BTree bT, ElemType e) {
  /******************************************/
  /*****         完成此段程序代码       *****/
  /******************************************/


int main() {
  BTree bT; // 二叉树变量。 
  ElemType e; // 元素变量。 
  int count; // 元素个数。
  int i;
    
  srand(time(NULL)); // 随机数产生器种子。 
  initial(&bT); // 初始化二叉树。 

  while (1) {
    printf("读入二叉树的元素个数:");
    scanf("%d", &count);
    if (count==0) return 0; // 若元素个数为,则停止代码执行。 
    for (i=0; i<count; i++) {
      e = rand() % 999 + 1;
      printf(" %3d", e); // 元素 e 的值在 1 与 999 (含)之间。 
      insert(&bT, e); // 将元素 e 新增到二叉树的节点。 
    }
    printf("\n产生的二叉树为:\n"); 
    printTree(bT, 1, 0); // 打印二叉树。
    printf("\n读入一个节点的数据:");
    scanf("%d", &e); // 二叉树的一个节点数据。 
        count = findCousins(bT, e); // 查找并打印节点数据为 e 的所有堂兄弟,返回堂兄弟个数。
    clearTree(&bT); // 清除二叉树。
    printf("\n=====================================\n");
  }
}

你好,我是有问必答小助手,非常抱歉,本次您提出的有问必答问题,技术专家团超时未为您做出解答

本次提问扣除的有问必答次数,将会以问答VIP体验卡(1次有问必答机会、商城购买实体图书享受95折优惠)的形式为您补发到账户。

​​​​因为有问必答VIP体验卡有效期仅有1天,您在需要使用的时候【私信】联系我,我会为您补发。