複製一棵二叉樹的非遞迴演算法
阿新 • • 發佈:2019-01-03
二叉連結串列型別定義:
typedef char TElemType; // 設二叉樹的元素為char型別
typedef struct BiTNode {
TElemType data;
BiTNode *lchild, *rchild;
} BiTNode, *BiTree;
可用佇列型別Queue的相關定義:實現函式如下:typedef BiTree QElemType; // 設佇列元素為二叉樹的指標型別 Status InitQueue(Queue &Q); Status EnQueue(Queue &Q, QElemType e); Status DeQueue(Queue &Q, QElemType &e); Status GetHead(Queue Q, QElemType &e); Status QueueEmpty(Queue Q);
void CopyBiTree(BiTree T, BiTree &TT) /* 基於層次遍歷的非遞迴複製二叉連結串列 */ { BiTree p1,p2; Queue Q1,Q2; if(!T){ TT = NULL; return ; } TT = (BiTree)malloc(sizeof(BiTNode)); InitQueue(Q1); InitQueue(Q2); EnQueue(Q1,T); EnQueue(Q2,TT); while(!QueueEmpty(Q1)){ DeQueue(Q1,p1); DeQueue(Q2,p2); p2 -> data = p1 -> data; if(p1 ->lchild){//複製左子樹 EnQueue(Q1,p1 -> lchild); p2 -> lchild = (BiTree)malloc(sizeof(BiTNode)); if(!p2 -> lchild){ exit(OVERFLOW); } EnQueue(Q2,p2 -> lchild); } if(p1 ->rchild){//複製右子樹 EnQueue(Q1,p1 -> rchild); p2 -> rchild = (BiTree)malloc(sizeof(BiTNode)); if(!p2 -> rchild){ exit(OVERFLOW); } EnQueue(Q2,p2 -> rchild); } } }