标题:关于树的初始化······
取消只看楼主
guchao2009
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:101
专家分:106
注 册:2009-4-13
结帖率:77.78%
 问题点数:0 回复次数:4 
关于树的初始化······

//(1)能进行初始化;即在算法中用双亲数组完成树的存储
//(2)输入任一结点,求其在数组中的存储位置
//(3)输入一结点,求其双亲
//(4)输入一结点,求其孩子
//(5)输入一结点,求其度(选作)
帮我写写······
希望有注释······
2009-11-23 21:23
guchao2009
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:101
专家分:106
注 册:2009-4-13
得分:0 
补充一下:
typedef char elemtype;
typedef struct
{
    elemtype data;
    int parent;
}pnode;
typedef struct
{
    pnode nodes[maxsize];
    int num;
}psqtree;
后面不知道了······
2009-11-23 21:24
guchao2009
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:101
专家分:106
注 册:2009-4-13
得分:0 
回复 3楼 geninsf009
你写的很复杂····
我不是刚学·····不过还是谢谢!!!
代码:
/*完成树的顺序存储结构(双亲数组法)实现。完成如下功能:
(1)能进行初始化;即在算法中用双亲数组完成树的存储
(2)输入任一结点,求其在数组中的存储位置
(3)输入一结点,求其双亲
(4)输入一结点,求其孩子
(5)输入一结点,求其度(选作)*/
//定义树变量:psqtree  t1;
//输入树中结点个数:cin>>t1.num;
//输入树中第i个结点的数据元素的值:
//cin>>t1.nodes[i].data
//输入第i个元素的双亲的下标
#include"iostream.h"
typedef char elemtype;
#define maxsize 10
typedef struct
{
    elemtype data;//数据元素的值
    int parent;//双亲结点下标位置
}pnode;//一个数据结点的类型
typedef struct
{
    pnode nodes[maxsize];//结构体数组,每一个元素有两个成员,data,parent
    int num;//树中结点的个数
}psqtree;//树的顺序存储结构类型
void createtree(psqtree  &t1)
{
  cout<<"输入结点的个数:";//输入结点个数,初始化num
      cin>>t1.num;
    for(int i=1;i<=t1.num;i++)
     {
        cin>>t1.nodes[i].data;
        cin>>t1.nodes[i].parent;
  }
}
int  arraylocation(psqtree &t1,elemtype e)//输入任一结点e,求其在数组中的存储位置i
{
    int i=1;
    while(t1.nodes[i].data!=e)
    {
        i++;
    }
    return i;
}
void getparent(psqtree &t1,elemtype e)//输入一结点,求其双亲
{
    int i=1;
    while(t1.nodes[i].data!=e)
    {
        i++;
    }
    cout<<t1.nodes[t1.nodes[i].parent].data;

}
void getsons(psqtree &t1,elemtype e)//输入一结点,求其孩子
{
    int i=1;
    while(t1.nodes[i].data!=e)

    {
        i++;
    }
    for(int j=1;j<=t1.num;j++)
    {
        if(t1.nodes[j].parent==i)
            cout<<t1.nodes[j].data;
    }

}

void getdu(psqtree &t1)
{
    int max=0;//结点子树的个数
    int i=-1;//结点的下标
        while(i<t1.num)
    {     int num=0;
         for(int j=1;j<=t1.num;j++)
        {
          if(t1.nodes[j].parent==i)
            num++;
         }
   
         if(max<num)
             max=num;
    i++;
    }
        cout<<max;
}


void dislist(psqtree  &t1)
{
 
    for(int i=1;i<=t1.num;i++)
     {
        cout<<t1.nodes[i].data;
       // cout<<t1.nodes[i].parent;
  }
}
void main()
{
psqtree t1;
createtree(t1);
dislist(t1);
elemtype e;
cout<<endl;
cout<<"输入结点为e的元素:";
cin>>e;
cout<<"数据的位置:"<<arraylocation(t1,e);
cout<<endl;
cout<<"输入结点为e的(求双亲):";
cin>>e;
getparent(t1,e);
cout<<endl;
cout<<"输入结点为e的(求孩子):";
cin>>e;
getsons(t1,e);   
cout<<endl;
cout<<"树的度为:";
getdu(t1);
}
2009-11-24 22:36
guchao2009
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:101
专家分:106
注 册:2009-4-13
得分:0 
我做的:
/*完成树的顺序存储结构(双亲数组法)实现。完成如下功能:
(1)能进行初始化;即在算法中用双亲数组完成树的存储
(2)输入任一结点,求其在数组中的存储位置
(3)输入一结点,求其双亲
(4)输入一结点,求其孩子
(5)输入一结点,求其度(选作)*/
//定义树变量:psqtree  t1;
//输入树中结点个数:cin>>t1.num;
//输入树中第i个结点的数据元素的值:
//cin>>t1.nodes[i].data
//输入第i个元素的双亲的下标


#include"iostream.h"
#define maxsize 20
typedef char elemtype;
typedef char tsbnode;
typedef struct       //双亲存储结构
{
    elemtype data;  //数据元素的值
    int parent;     //双亲结点下标
}pnode;             //一个结点结构            
typedef struct      //孩子链存储结构
{
    pnode nodes[maxsize];   //结构体数组,每一个元素有两个成员,data,parent
    int num;                //树中结点的个数
}psqtree;                   //树的顺序存储结构类型
  
void createtree(psqtree  &t1)    //能进行初始化;即在算法中用双亲数组完成树的存储
{
    int i;               
    for(i=1;i<=t1.num;i++)      //依次输入元素的值,初始化数组nodes[]
    {
        cout<<"输出第"<<i<<"存储元素的值和下标:";
        cin>>t1.nodes[i].data;
        cin>>t1.nodes[i].parent;
    }
}

void gettree(psqtree &t1,elemtype e)     //输入任一结点值,求其在数组中的存储位置
{
    int i=1;
    while(e!=t1.nodes[i].data)
    {
        i++;
    }
    if(i>t1.num)
        cout<<"无此结点!"<<endl;
    else
        cout<<i<<endl;
}

void gettreel(psqtree &t1,elemtype e)    //输入一结点值,求其双亲
{
    int i;
    cout<<"输入一结点:";  
    cin>>e;
    while(e!=t1.nodes[i].data)
    {
        i++;
    }
    if(t1.nodes[i].data==t1.nodes[0].data)
    {
        cout<<"此结点为根节点,没有双亲!"<<endl;
    }
    else
    {
        if(i>t1.num)
        {
            cout<<"无此结点!"<<endl;
        }
        else
        {
            cout<<"其双亲元素的值为:"<<endl;
            cout<<t1.nodes[t1.nodes[i].parent].data<<endl;
        }
    }
}

void gettree2(psqtree  &t1,elemtype e)   //输入一结点,求其孩子
{
    int i=1;
    cout<<"输入一结点:";  
    cin>>e;
    int j=0;
    while(t1.nodes[i].data!=e)
    {
        i++;
    }
    while(j<t1.num)   
    {
        if(t1.nodes[j].parent==i)
        {
            cout<<"子结点:"<<t1.nodes[j].data<<endl;
        }
        j++;
    }
}

void main()
{
    psqtree  t1;             //定义树变量
    elemtype e;
    cout<<"输出结点个数:";    //输入结点个数,初始化num
    cin>>t1.num;  
    createtree(t1);
    cout<<"输入任意一结点值:";  
    cin>>e;
    cout<<"存储的位置是:"<<endl;
    gettree(t1,e);
    gettreel(t1,e);
    gettree2(t1,e);
}
2009-11-25 13:24
guchao2009
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:101
专家分:106
注 册:2009-4-13
得分:0 
较经典的:
#include"iostream.h"
#include <stdlib.h>
typedef char elemtype;
class pnode
{
public:
    elemtype data;
    int parent;
};//一个结点结构
class psqtree
{
    pnode nodes[50];
    int num;
public:
    void init();//初始化
    int locateelem(char p);//求结点位置
    void findparent(char p);//求双亲
    void findchild(char p);//求孩子和度
    };//树的顺序存储结构类型
void  psqtree::init()      
    {
        int i,m;
        char e;
        cout<<"请输入节点个数:";cin>>num;
        for(i=0;i<num;i++)
        {
            cout<<"请输入节点"<<i+1<<"的值(字母):";cin>>e;nodes[i].data=e;
            cout<<"请输入节点"<<i+1<<"双亲的下标:";cin>>m;nodes[i].parent=m;
        }
        cout<<endl;
    }
int psqtree::locateelem(char p)   
{
      int i=0;
      while(nodes[i].data!=p)
          i++;
      if(i>num) {cout<<"无此值的结点,自己看清楚点啊- -||\n";return 0;}
      else {cout<<"节点的位置:"<<i+1<<endl;return 1;}
}
void psqtree::findparent(char p)
{
    int i=0;
      while(nodes[i].data!=p)
          i++;
      if(nodes[i].data==nodes[0].data) cout<<"该结点是根节点,没有双亲的啦- -||\n";
      else
      {
      if(i>num) cout<<"无此值的结点,自己看清楚点啊- -||\n";
      else cout<<"双亲求到啦:"<<nodes[nodes[i].parent-1].data<<endl;
      }
}
void psqtree::findchild(char p)  
{
    int i=0,j=0,m=0;
      while(nodes[i].data!=p)
          i++;
      i++;
      while(j<num)   
     {
          if(nodes[j].parent==i) {cout<<"子结点:"<<nodes[j].data<<endl;m++;}
         j++;
     }
    if(!m) cout<<"sorry,这个结点没有孩子\n";
      cout<<"该结点的度:"<<m<<endl;
}
int main()
{
    psqtree s;
    s.init();
    char reply='y';
    while(reply=='y')
    {
    system("cls");   
    cout<<"查找结点:";char p;cin>>p;
    //s.locateelem(p);
    if(s.locateelem(p))
    {s.findparent(p);
    s.findchild(p);}
    cout<<"继续功能测试吗(y/n):";
    cin>>reply;
    cout<<endl;
    }
    return 1;
}
2009-11-25 13:25



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-293143-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 1.310576 second(s), 8 queries.
Copyright©2004-2025, BCCN.NET, All Rights Reserved