{資料結構}森林轉二叉樹/樹轉二叉樹/c語言程式碼/演算法
阿新 • • 發佈:2018-12-09
具體原理網上書上都有,這裡只貼上程式碼。 該演算法是把樹看作特殊的圖,儲存在鄰接表裡了。
typedef struct Branch
{
int cIdx;//指向結點的位置
Branch *next;//指向下一個結點
}Branch;//鄰接表裡的下一個孩子結點
typedef struct
{
int data;
Branch *first;//指向第一個孩子結點
}TNode;//定義結點
typedef struct
{
TNode list[maxSize];//鄰接表表頭
int n;//結點個數
}Tree;//定義樹
typedef struct BTNode
{
int data;
struct BTNode *child;
struct BTNode *sibling;//兄弟結點
}BTNode;
void treeToBtree(Tree *t,BTNode *&bt,int i)
{//樹轉二叉樹
if(t != NULL)
{
TNode p = t.list[i];
bt = p;//二叉樹的頭結點等於樹的頭結點
Branch b = p.first;//該結點的孩子結點
BTNode *q = bt->child;//二叉樹的左孩子結點
while (b)//把該層的樹全部轉為二叉樹
{
treeToBtree(t,q,b->cIdx);//若該結點以及該結點的子孫結點轉為二叉樹
b = b->next;//指向樹結點下一個孩子結點
q = q->sibling;//指向二叉樹的右孩子結點
}
}
}
void forestToBtree(Tree *F[maxsize],int n,BTNode *&fn)
{//森林轉二叉樹
int i = 0;
BTNode *q = bt;//指向二叉樹的每一個右孩子結點
while(i < fn)
{
treeToBtree(F[i],q,0);//將每一個森林轉為二叉樹
++i;
q = q->sibling;//連線各二叉樹
}
}