二叉樹的便歷主要有四種方式:
(D根節點 L左子樹 R右子樹)
(1)先序遍歷DLR
(2)中序遍歷LDR
(3)後序遍歷LRD
(4)按層遍歷
(1)先序遍歷
遞迴演算法:
{
if(bt!=NULL)
{
printf("%d",bt->data);
PreOrder(bt->lchild);
PreOrder(bt->rchild);
}
}
非遞迴演算法
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;
}
}
}
以本圖為例,演示非遞迴的先序遍歷演算法:
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.棧中無元素,遍歷結束。