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


遞歸算法

void InOrder(BTNode *bt)
{
	if(bt!=NULL)
	{
                InOrder(bt->lchild);
		printf("%d",bt->data);
		InOrder(bt->rchild);
	}
}

非遞歸算法

#difine NULL 0
Void InOrder(BTNode *bt)
{
	BTNode *p=bt;
        int top =0;
	printf("\ninofder travel:\n");
	While(!(p==NULL&&top==NULL))
	{
		while(p!=NULL)
		{
			push(p);
			p=p->lchild;
		}
                pop();
                printf("%d",p->data);
		p=p->rchild;
	}
}

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

1.首先,程序通過BTNode *p=bt將根節點的地址賦給p,此時p指向A;
2.p!=NUll;將A入棧;p指向A的左孩子B;
3.p!=NULL;將B入棧;p指向B的左孩子D;
4.p!=NULL;將D入棧;p指向B的左孩子,左孩子為空;
5.p=NULL;彈出D;打印D,p指向D的右孩子G;
6.p!=NULL;將G入棧;p指向G的左孩子,左孩子為空;
7.p=NULL;彈出G;打印G,p指向G的右孩子,右孩子為空;
8.p=NULL;彈出B;打印B,p指向B的右孩子E;
9.p!=NULL;將E入棧;p指向E的左孩子H;
10.p!=NULL;將H入棧;p指向E的左孩子,左孩子為空;
11.p=NULL;彈出H;打印H,p指向H的右孩子,右孩子為空;
12.p=NULL;彈出E;打印E,p指向E的右孩子,右孩子為空;
13.p=NULL;彈出A;打印A,p指向A的右孩子C;
14.p!=NUll;將C入棧;p指向C的左孩子E;
15.p!=NUll;將F入棧;p指向F的左孩子I;
16.p!=NUll;將I入棧;p指向I的左孩子,左孩子為空;
17.p=NULL;彈出I;打印I,p指向I的右孩子,右孩子為空;
18.p=NULL;彈出F;打印F,p指向F的右孩子,右孩子為空;
19.p=NULL;彈出C;打印C,p指向C的右孩子,右孩子為空;
20.p=NULL;棧中無元素,結束。


免責聲明!

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



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