一般的树的创建,兄弟孩子表示法

本文介绍了一种使用兄弟孩子表示法创建树结构的方法,并通过具体的数据结构实现了树的构建过程。利用队列和节点指针,文章详细阐述了如何根据节点间的父子及兄弟关系构造树形数据结构。

#include "iostream"
using namespace std;
/************************************************************************/
/* 树的一般创建,兄弟孩子表示法¨
节点序号1 2 3 4 5 6 7 8 9 10 11 12 13
data  0 0 0 0 0 0 0 0 0 0 0 0 0
parent  0 1 2 2 1 5 6 6 1 9 9 9 12                                     */
/************************************************************************/

struct TreeNode {
char data;
int NodeFlag;
TreeNode * Leftmost_Child,* Right_Sibling;
};
typedef   TreeNode* TPosition;
int treeMap [13][3];
int nodeNum;
queue <TPosition> nodeQueue;
void addNode();
//根据INDEX建立节点
TPosition createNode(int index)
{
 TPosition temp=new TreeNode;
 temp->data=treeMap[index][1];
 temp->NodeFlag=treeMap[index][0];
 temp->Leftmost_Child=temp->Right_Sibling=NULL;
 return temp;
}
//根据父节点添加子节点
void addNodeToParent(TPosition  tempP)
{
 bool findFlag=false;
 int i,j,k;
 //判断是否是叶节点
 for ( i=0;i<nodeNum;i++)
 {
  if (treeMap[i][2]==tempP->NodeFlag)
  {
   findFlag=true;
   break;
  }
 }
 //叶节点返回
 if (!findFlag)
 {
  return;
 }
 //保存父节点
 TPosition parentNode=tempP;
 //寻找子节点
 for ( i=0;i<nodeNum;i++)
 {
  tempP=parentNode;
  if (treeMap[i][2]==tempP->NodeFlag)
  {
   if (tempP->Leftmost_Child==NULL)
   {
    tempP->Leftmost_Child=createNode(i);
    addNodeToParent(tempP->Leftmost_Child);
   }
   else
   {
    tempP=tempP->Leftmost_Child;
    //在节点右树的最右端,添加兄弟节点
    while ((tempP->Right_Sibling)!=NULL)
    {
     tempP=tempP->Right_Sibling;
    }
    tempP->Right_Sibling=createNode(i);
    addNodeToParent(tempP->Right_Sibling);
   }
  }
 }
}
TPosition createTree()
{
 int i,j,k;
 TPosition root;
 root=createNode(0);

 TPosition tempP=root;
 addNodeToParent(root);
 return root;
}
int main()
{

 cin>>nodeNum;
 int a;
 for(int j=0;j<3;j++)
 {
  for(int i=0;i<nodeNum;i++)
  {
   cin>>treeMap[i][j]; 
  }
  a++;
 }
 createTree();
 return;
}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值