1. 程式人生 > >二叉樹先序迴圈,程式碼及詳解

二叉樹先序迴圈,程式碼及詳解

二叉樹的便歷主要有四種方式: (D根節點 L左子樹 R右子樹) (1)先序遍歷DLR (2)中序遍歷LDR (3)後序遍歷LRD (4)按層遍歷 (1)先序遍歷 遞迴演算法: ``` void PreOrder(BTNode *bt) { if(bt!=NULL) { printf("%d",bt->data); PreOrder(bt->lchild); PreOrder(bt->rchild); } } ``` 非遞迴演算法 ``` #difine NULL 0 Void PreOrder(BTNode *bt) { BTNode *p=bt; printf("\npreorder travel:\n"); While(!(p==NULL&&top==NULL)) { if(p!=NULL) { printf("%d",p->data); push(p); p=p->lchild; } else { pop(); p=p->rchild; } } } ``` 以本圖為例,演示非遞迴的先序遍歷演算法: ![](https://img2020.cnblogs.com/blog/2186505/202010/2186505-20201024121857350-856348405.png) 1.首先,程式通過BTNode *p=bt將根節點的地址賦給p,此時p指向A; 2.執行if中的內容;列印A,將A放入棧中,指標指向A的左孩子B; 3.執行if中的內容;列印B,將B放入棧中,指標指向B的左孩子D; 4.執行if中的內容:列印D,將D放入棧中,指標指向D的左孩子,左孩子為空; 5.執行else中的內容;從棧中彈出D,指標指向D的右孩子; 6.執行if中的內容:列印G,將G放入棧中,指標指向G的左孩子,左孩子為空; 7.執行else中的內容;從棧中彈出G,指標指向G的右孩子,右孩子為空; 8.執行else中的內容;從棧中彈出B,指標指向B的右孩子E; 9.執行if中的內容:列印E,將E放入棧中,指標指向E的左孩子H; 10.執行if中的內容:列印H,將H放入棧中,指標指向H的左孩子,左孩子為空; 11.執行else中的內容;從棧中彈出H,指標指向H的右孩子,右孩子為空; 12.執行else中的內容;從棧中彈出E,指標指向E的右孩子,右孩子為空; 13.執行else中的內容;從棧中彈出A,指標指向A的右孩子C; 14.執行if中的內容:列印C,將C放入棧中,指標指向C的左孩子F; 15.執行if中的內容:列印F,將F放入棧中,指標指向F的左孩子I; 16執行if中的內容:列印I,將I放入棧中,指標指向I的左孩子,左孩子為空; 17.執行else中的內容;從棧中彈出I,指標指向I的右孩子,右孩子為空; 18.執行else中的內容;從棧中彈出F,指標指向F的右孩子,右孩子為空; 19.執行else中的內容;從棧中彈出C,指標指向C的右孩子,右孩子為空; 20.棧中無元素,遍歷結束。 ![](https://img2020.cnblogs.com/blog/2186505/202010/2186505-20201024121920850-16777789