1. 程式人生 > >{資料結構}森林轉二叉樹/樹轉二叉樹/c語言程式碼/演算法

{資料結構}森林轉二叉樹/樹轉二叉樹/c語言程式碼/演算法

具體原理網上書上都有,這裡只貼上程式碼。 該演算法是把樹看作特殊的圖,儲存在鄰接表裡了。

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;//連線各二叉樹 } }