樹轉二叉樹
使用隊列,編寫transfrom函數,將普通樹轉換成對應的二叉樹。二叉樹的相關定義如下:
typedef int DataType;
typedef struct Node{DataType data;struct Node* left;struct Node* right;
}BiTNode, *BiTree;
普通樹節點的定義如下:
#define MAX_CHILDREN_NUM 5
struct _CSNode
{DataType data;struct _CSNode *children[MAX_CHILDREN_NUM];
};
typedef struct _CSNode CSNode;
其中,子樹的根節點的指針存放在children數組的前k個元素中,即如果children[i]的值為NULL,
而children[i-1]不為NULL,則表明該結點只有i棵子樹,子樹根結點分別保存在children[0]至children[i-1]中。
隊列相關定義及操作如下:
struct __Queue
{int i, j; //指向數組內元素的游標void **array;
};
typedef struct __Queue Queue;Queue* create_queue(); //創建隊列
bool is_empty_queue(Queue *tree); //隊為空返回true,不為空時返回false
void* del_queue(Queue *tree); //結點指針出隊
void add_queue(Queue *tree, void *node); //結點指針入隊
void free_queue(Queue *tree); //釋放隊列
transform函數定義如下:
BiTNode* transform(CSNode *root);
其中 root 為普通樹的根結點,函數返回該樹對應二叉樹的根結點。
#include <stdlib.h>
#include <stdio.h>
BiTNode* transform(CSNode *root){if(!root) return NULL;Queue *que, *bque;BiTNode *p;//二叉樹根結點創立 //小心點, 記得分配空間 p = (BiTNode *)malloc(sizeof(struct Node));p->data = root->data;p->left = p->right = NULL;que = create_queue();bque = create_queue();//注意add_queue函數的返回值, 所以不用 xx = add_queue(xx)的形式add_queue(que, root);add_queue(bque, p);while(!is_empty_queue(que)){BiTree bq;//創建二叉樹隊列頭結點(根結點) bq = del_queue(bque);CSNode *q;q = del_queue(que);//第一次執行該操作就相當于建立了二叉樹的根int i = 0; BiTNode *former = NULL;for(i = 0; i < MAX_CHILDREN_NUM; i++){//遞歸形式if(q->children[i]){//判存在 BiTNode *bnode = (BiTNode *)malloc(sizeof(struct Node));bnode->data = q->children[i]->data;bnode->left = bnode->right = NULL; //放置結點位置if(i == 0){bq->left = bnode;}else{//兄弟結點變成父子結點former->right = bnode;}former= bnode;add_queue(bque, bnode);add_queue(que, q->children[i]);}} }free(que->array);
//釋放順序不能錯free(que);free(bque->array);free(bque);return p;
}
?
總結
以上是生活随笔為你收集整理的二叉树-树转二叉树 使用队列,编写transfrom函数,将普通树转换成对应的二叉树。的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。