二叉樹先序遍歷,代碼及詳解


二叉樹的便歷主要有四種方式:
(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;
		}
	}
}

以本圖為例,演示非遞歸的先序遍歷算法:

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.棧中無元素,遍歷結束。


免責聲明!

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



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