1. 程式人生 > >二叉樹的遍歷實現

二叉樹的遍歷實現

size 非遞歸算法 沒有 con nod order reorder 實現 traverse

二叉樹的先序遍歷
//先序遍歷二叉樹的遞歸實現
void PreOrderTraverse(BiTree T)
{
	if(T)
	{
		printf("%2c",T->data);//訪問根結點
		PreOrderTraverse(T->lchild);//先序遍歷左子樹
        PreOrderTraverse(T->rchild);//先序遍歷右子樹
	}
}
//二叉樹的先序遍歷非遞歸算法
void PreOrderTraverse(BiTree T)
{
	BiTree stack[MAXSIZE];//定義一個棧。用於存放結點的指針
	int top;//定義棧頂指針
	BitNode *p;//定義一個結點的指針
	top=0;//初始化棧
	p=T;
	while(p!=NULL||top>0)
	{
		while(p!=NULL)//假設p不空。訪問根結點。遍歷左子樹
		{
           printf("%2c",T->data);//訪問根結點
		   stack[top++]=p;//將p入棧
		   p=p->lchild;//遍歷左子樹
		}
		if(top>0)//假設棧不空
		{
			p=stack[--top];//棧頂元素出棧
			p=p->rchild;//遍歷右子樹
		}
	}
}

二叉樹的中序遍歷

//中序遍歷二叉樹的遞歸實現
void PreOrderTraverse(BiTree T)
{
	if(T)
	{
		PreOrderTraverse(T->lchild);//中序遍歷左子樹
        printf("%2c",T->data);//訪問根結點
        PreOrderTraverse(T->rchild);//中序遍歷右子樹
	}
}
//二叉樹的中序遍歷非遞歸算法
void PreOrderTraverse(BiTree T)
{
	BiTree stack[MAXSIZE];//定義一個棧,用於存放結點的指針
	int top;//定義棧頂指針
	BitNode *p;//定義一個結點的指針
	top=0;//初始化棧
	p=T;
	while(p!=NULL||top>0)
	{
		while(p!=NULL)//假設p不空,訪問根結點,遍歷左子樹
		{
		   stack[top++]=p;//將p入棧
		   p=p->lchild;//遍歷左子樹
		}
		if(top>0)//假設棧不空
		{
			p=stack[--top];//棧頂元素出棧
            printf("%2c",T->data);//訪問根結點
			p=p->rchild;//遍歷右子樹
		}
	}
}

二叉樹的後序遍歷

//後序遍歷二叉樹的遞歸實現
void PreOrderTraverse(BiTree T)
{
	if(T)
	{
		PreOrderTraverse(T->lchild);//後序遍歷左子樹
        PreOrderTraverse(T->rchild);//後序遍歷右子樹
        printf("%2c",T->data);//訪問根結點
        
	}
}
//二叉樹的後序遍歷非遞歸算法
void PreOrderTraverse(BiTree T)
{
	BiTree stack[MAXSIZE];//定義一個棧。用於存放結點的指針
	int top;//定義棧頂指針
	BitNode *p,*q;//定義結點的指針
	top=0;//初始化棧
	p=T,q=NULL;
	while(p!=NULL||top>0)
	{
		while(p!=NULL)//假設p不空。訪問根結點。遍歷左子樹
		{
		   stack[top++]=p;//將p入棧
		   p=p->lchild;//遍歷左子樹
		}
		if(top>0)//假設棧不空
		{
			p=stack[top-1];//取棧頂元素
			if(p->rchild==NULL||p->rchild==q)
				//假設p沒有右孩子結點,或者右孩子結點已經訪問過
			{
                printf("%2c",T->data);//訪問根結點
				q=p;
				p=NULL;
				top--;//出棧
			}
			else
				p=p->rchild;
		}
	}
}


二叉樹的遍歷實現