编写复制一棵二叉树的非递归算法。
要求实现下列函数:
void CopyBiTree(BiTree T, BiTree &TT);
/* 基于层次遍历的非递归复制二叉链表 */
二叉链表类型定义:
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)
- /* 基于层次遍历的非递归复制二叉链表 */
- {
- QElemType e,a,b;
- Queue Q1,Q2;
- InitQueue(Q1);
- InitQueue(Q2);
- if(!T){TT=T;}
- else
- {
- TT=(BiTree)malloc(sizeof(BiTNode));
- TT->data=T->data;
- EnQueue(Q1,TT);
- EnQueue(Q2,T->lchild);
- EnQueue(Q2,T->rchild);
- while(!QueueEmpty(Q2))
- {
- DeQueue(Q2,a);
- DeQueue(Q2,b);
- DeQueue(Q1,e);
- if(a)
- {
- e->lchild=(BiTree)malloc(sizeof(BiTNode));
- e->lchild->data=a->data;
- EnQueue(Q1,e->lchild);
- EnQueue(Q2,a->lchild);
- EnQueue(Q2,a->rchild);
- }
- else{e->lchild=NULL;}
- if(b)
- {
- e->rchild=(BiTree)malloc(sizeof(BiTNode));
- e->rchild->data=b->data;
- EnQueue(Q1,e->rchild);
- EnQueue(Q2,b->lchild);
- EnQueue(Q2,b->rchild);
- }
- else{e->rchild=NULL;}
- }
- }
- }