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

莫黎_MOLI發表於2020-10-24

二叉樹的便歷主要有四種方式:
(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.棧中無元素,遍歷結束。

相關文章