孩子表示法存储普通树

孩子表示法存储普通树采用的是 顺序表+链表 的存储方式

其中链表带头节点

在这里插入图片描述

//
// Created by lzb-linux on 2021/3/18.
//
#include "iostream"
using namespace std;
#define TElemType char

//孩子位置的链表节点
typedef struct Childindex {
  int index;
  Childindex *next; //链表的后继指针
} ChildLink;
//树节点
typedef struct Node {
  TElemType data;
  ChildLink *first; //连接孩子节点位置链表的头指针
} Node;
//普通树
typedef struct CTree {
  Node *CT;
  int num;
} CTree;
//初始化
bool InitTree(CTree &CTree) {
  int n;
  printf("输入初始化容量:");
  cin >> n;
  CTree.CT = new Node[n];
  for (int i = 0; i < n; i++) {
    CTree.CT[i].data = '!';
    CTree.CT[i].first = new ChildLink; //带头节点的链表
    CTree.CT[i].first->next = NULL;
  }
  CTree.num = 0;
  return true;
}

bool AddTreeNode(CTree &CTree) {
  int n;
  printf("请输入数量:");
  cin >> n;
  printf("输入字符:");
  for (int i = 0; i < n; i++) {
    cin >> CTree.CT[i].data;
    CTree.num++;
  }
  for (int i = 0; i < n; i++) {
    printf("%c [%d]\n", CTree.CT[i].data, i);
  }
  for (int i = 0; i < n; i++) {
    printf("请输入节点%c的孩子节点位置:", CTree.CT[i].data);
    ChildLink *pre = CTree.CT[i].first; 
    int index;
    while (true) {
      cin >> index;
      if (index == -1) { //输入-1表示结束输入
        break;
      }
      Childindex *Ci = new ChildLink;
      Ci->index = index;
      Ci->next = pre->next;
      pre->next = Ci;
    }
  }
  return true;
}

void ShowTree(CTree CTree) {
  for (int i = 0; i < CTree.num; i++) {
    printf("节点%c的孩子节点为", CTree.CT[i].data);
    for (ChildLink *cur = CTree.CT[i].first->next; cur != NULL;
         cur = cur->next) {
      printf("%c ", CTree.CT[cur->index].data);
    }
    printf("\n");
  }
}
bool FindNode(CTree CTree, TElemType c) {
  for (int i = 0; i < CTree.num; i++) {
    if (CTree.CT[i].data == c) {
      printf("节点%c的孩子节点为", CTree.CT[i].data);
      for (ChildLink *cur = CTree.CT[i].first->next; cur != NULL;
           cur = cur->next) {
        printf("%c ", CTree.CT[cur->index].data);
      }
      printf("\n");
      return true;
    }
  }
  return false;
}
void Find(CTree CTree) {
  TElemType c;
  printf("请输入需要查找的节点数据:");
  cin >> c;
  if (FindNode(CTree, c)) {
    printf("未找到节点!\n");
  }
}

void Meue() {
  printf("1.添加节点数据\n");
  printf("2.显示所有节点数据和孩子节点\n");
  printf("3.查找节点\n");
}

int main() {
  CTree CT;
  int choice;
  InitTree(CT);
  while (true) {
    Meue();
    printf("输入序号:");
    cin >> choice;
    if (choice == 0) {
      break;
    }
    switch (choice) {
    case 1:
      AddTreeNode(CT);
      break;
    case 2:
      ShowTree(CT);
      break;
    case 3:
      Find(CT);
      break;
    }
  }
  return 0;
}

在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值