树的存储结构--双亲表示法

本文探讨了树的存储结构之一——双亲表示法,详细解释了如何使用这种表示方法来存储树的数据结构。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

树的存储结构--双亲表示法

#include<stdio.h>
#include<stdlib.h>
#define maxsize 20
#include<iostream>
using namespace std;
typedef struct 
{
    char data;
 int parent;//双亲位置
}pnode;
typedef struct
{
 pnode s[maxsize];
 int n;  //结点数;
}ptree;
//初始化,也可以不初始化
void inittree(ptree &T)
{  
T.n=0;

//创建并存储
void create(ptree &T)
{   
 
 int i;
 cout<<"请输入节点数:";
 cin>>T.n;
 cout<<"请输入节点基本信息->节点的值,双亲位置(根节点的双亲位置为-1):";
 for(i=0;i<T.n;i++)
 {
  cin>>T.s[i].data>>T.s[i].parent;
 }
}
//查找c的父亲
void reserch(ptree &T,char c)
{   
 
 for(int i=0;i<T.n;i++)
 {
  if(T.s[i].data==c)   //有二种情况;有可能为根节点;有可能不是根节点;
  {
   
   if(T.s[i].parent>=0)
   { 
    cout<<"其父亲为:";
    cout<<T.s[ T.s[i].parent].data<<endl;
    break;  //因为父亲只有一个找到后立即结束整个for(int i=0;i<T.n;i++)循环
   }
   else 
   {
    cout<<"其为根节点所以没有父亲"<<endl;
    break;
   }
  }
  else if(T.s[i].data!=c&&i>=T.n-1)  // //在整个数组中层层寻找字符c,并且寻遍整个数组(i>=T.n-1为界)都没找到
  {
   cout<<"该字符不在范围内"<<endl;
  }
  
 }
 
}
//查找c的孩子
void reserch2(ptree &T,char c)
{   
 
 for(int i=0;i<T.n;i++)
 {
  if(T.s[i].data==c) //找到c;有二种情况:有左右孩子或左孩子或右孩子的节点;为叶子;
  {   
   int m=0;//记录孩子的个数
   for(int j=0;j<T.n;j++) 
   {   
    
    if(T.s[j].parent==i)
    {  
     m++;  
     cout<<"其孩子为:";
     cout<<T.s[j].data<<endl;
    } //可能有多个孩子所以找到一个孩子后没有结束整个for(int j=0;j<T.n;j++)循环;
    else if(T.s[j].parent!=i&&j>=T.n-1&&m==0) //确定其为叶子;因为如果没有m=0,即便查找的字符不是叶子而整个数组最后一个字符即使
    {                                         //不是其孩子也满足T.s[j].parent!=i&&j>=T.n-1,也会输出语句"其为叶子所以没有孩子";
     cout<<"其为叶子所以没有孩子"<<endl;
    }
   }
   break; //找到c并且找到了的孩子后结束整个for(int i=0;i<T.n;i++)循环;因为数组中仅且只有一个字符c
  }
  
  else  if(T.s[i].data!=c&&i>=T.n-1)  //在整个数组中层层寻找字符c,并且寻遍整个数组(i>=T.n-1为界)都没找到
  {
   cout<<"该字符不在范围内"<<endl;
  }
  
 }
 
}
//打印
void print(ptree &T)
{
 for(int i=0;i<T.n;i++)
  cout<<T.s[i].data<<" "<<T.s[i].parent<<endl;
    
}
void main()
{   
 char c;
 ptree T;
 create(T);
 cout<<"您刚才输入的基本信息为:"<<endl;
    print(T);
 cout<<"请输入要查找父亲的字符:"<<endl;
    while((cin>>c&&c!='n'))  //当输入的字符为n时结束循环
 {  
    reserch(T,c);
    cout<<"请输入要查找孩子的字符:"<<endl;
 cin>>c;
    reserch2(T,c);
 cout<<"请输入要查找父亲的字符:"<<endl;
 }
  
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值