1. 程式人生 > >複製一棵二叉樹的非遞迴演算法

複製一棵二叉樹的非遞迴演算法

二叉連結串列型別定義:

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);
        }
    }
}