如何復制一棵二叉樹


基本思路:

(1)如果樹非空,則復制該根節點,同時,把這兩個節點分別進入QueueFormer,QueueCopy

(2)讓pFormer指向QueueFormer的對頭,pCopy指向QueueCopy的隊頭。

(3)pFormer的左右孩子,若非空,則復制其data,同時修改pCopy的左右孩子的指針,並對非空節點都入站操作,

(4)對QueueFormer和QueueCopy出棧(對頭節點已完成復制)

(5)重復(2)~(4)直到隊列為空

(6)返回頭指針,復制完成。

代碼:

 1 BinTree CopyTree(BinTree BT){
 2     Queue QueueFormer;
 3     Queue QueueCopy;
 4     BinTree root=NULL;
 5     init(QueueFomer);
 6     init(QueueCopy);
 7     if(BT!=NULL){
 8         root=(BinTree)malloc(sizeof(BinTNode));
 9         root->data=BT->data;
10         root->lchild=NULL;
11         root->rchild=NULL:
12         EnQueue(QueueFormer,BT);
13         EnQueue(QueueCopy,root);
14     }
15     while(!isEmptyQueue(QueueFormer)){
16         BinTree pFomer=QueueHeader(QueueFormer);
17         BinTree pCopy=QueueHeader(QueueCopy);
18         if(pFormer->lchild!=NULL)//復制左孩子
19         {
20              BinTree temp=(BinTree)malloc(sizeof(BinTNode));
21              temp->data=pFormer->lchild->data;
22              temp->lchild=NULL;
23              temp->rchild=NULL:
24              pCopy->lchild=temp;
25              EnQueue(QueueFormer,pFormer->lchild);
26              EnQueue(QueueCopy,temp):
27         }
28         if(pFormer->rchild!=NULL)//復制右孩子
29         {
30              BinTree temp=(BinTree)malloc(sizeof(BinTNode));
31              temp->data=pFormer->rchild->data;
32              temp->lchild=NULL;
33              temp->rchild=NULL:
34              pCopy->rchild=temp;
35              EnQueue(QueueFormer,pFormer->rchild);
36              EnQueue(QueueCopy,temp);
37         }
38         DeQueue(QueueFormer);
39         DeQueue(QueueCopy);
40     }
41 return root;
42 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM