国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

查找二叉樹的實現-層序,先序非遞歸實現

2019-11-08 20:03:41
字體:
來源:轉載
供稿:網友

參考書目《數據結構與算法分析(c語言描述)》

//接口函數

#ifndef _SEATREE_H#define _SEATREE_Hstruct TreeNode{	int Element;	struct TreeNode *Left;	struct TreeNode *Right;};typedef struct TreeNode *Position;Position MakeEmpty(Position T);Position Find(int X,Position T);Position FindMin(Position T);Position FindMax(Position T);Position Insert(int X,Position T);Position Delete(int X,Position T);void VisitTree(Position T);void ExchangeTree(Position T);void LevelOrder(Position T);void PReOrder1(Position T);void PreOrder2(Position T);#endif

//接口函數實現

#include <stdio.h>#include <stdlib.h>#include "seatree.h"Position Insert(int X,Position T){	if(T==NULL)	{		T=(Position)malloc(sizeof(struct TreeNode));	    T->Element=X;	    T->Left=T->Right=NULL;	}	else if(X>T->Element)		T->Right=Insert(X,T->Right);	else if(X<T->Element)		T->Left=Insert(X,T->Left);	return T;}Position Delete(int X,Position T)  //遞歸實現樹節點的刪除{	Position TmpCell;	if(T==NULL)		return NULL;	else if(X>T->Element)		T->Right=Delete(X,T->Right);	else if(X<T->Element)		T->Left=Delete(X,T->Left);	else if(T->Left!=NULL&&T->Right!=NULL)	{		TmpCell=FindMin(T->Right);		T->Element=TmpCell->Element;		T->Right=Delete(T->Element,T->Right);	}	else	{		TmpCell=T;		if(T->Left==NULL)			T=T->Right;		else 			T=T->Left;		free(TmpCell);	}	return T;}Position Find(int X,Position T){	if(T==NULL)		return NULL;	else if(X<T->Element)		return Find(X,T->Left);	else if(X>T->Element)		return Find(X,T->Right);	else 		return T;}Position FindMin(Position T){	if(T==NULL)		return NULL;	else if(T->Left==NULL)		return T;	else 		return FindMin(T->Left);}Position FindMax(Position T){	if(T==NULL)		return NULL;	else if(T->Right==NULL)		return T;	else		return FindMax(T->Right);}Position MakeEmpty(Position T){	if(T!=NULL)	{		MakeEmpty(T->Left);		MakeEmpty(T->Right);		free(T);	}	return NULL;}void VisitTree(Position T){	if(T!=NULL)	{		//printf("%d ",T->Element); //先序遍歷		VisitTree(T->Left);		printf("%3d",T->Element);  //中序遍歷		VisitTree(T->Right); 	}}void ExchangeTree(Position T) //樹的鏡像{	Position temp;	if(T)	{		ExchangeTree(T->Left);		ExchangeTree(T->Right);		temp=T->Left;		T->Left=T->Right;		T->Right=temp;	}}void LevelOrder(Position T)  //層序遍歷{	Position stack[100];	int front=0;	int rear=1;	stack[0]=T;	while(front<rear)	{		if(stack[front])		{			printf("%3d",stack[front]->Element);			stack[rear++]=stack[front]->Left;			stack[rear++]=stack[front]->Right;			front++;		}		else		front++;	}}void PreOrder1(Position T)  //先序非遞歸實現{	Position p,stack[100]; //這里最多儲存100個元素	int top;	p=T;	if(T!=NULL)	{		top=0;		stack[top++]=p;		while(top>0)		{			p=stack[--top];			printf("%3d",p->Element);		    if(p->Right)		    {			    stack[top++]=p->Right;		    }		    if(p->Left)		    {			    stack[top++]=p->Left;		    }		}	}}void PreOrder2(Position T){	if(T)	{		printf("%3d",T->Element);		PreOrder2(T->Left);		PreOrder2(T->Right);	}}

//main函數入口

#include <stdio.h>#include "seatree.h"int main(int argc, char **argv){	int rands[12]={21,52,5,1,55,32,66,77,90,34,56,86};	int i;	Position Pos;	Pos=NULL; //初始化的重要性	for(i=0;i<12;i++)	{		Pos=Insert(rands[i],Pos);	}	VisitTree(Pos);	printf("/n");	LevelOrder(Pos);	printf("/n");	PreOrder1(Pos);	printf("/n");	PreOrder2(Pos);	printf("/nMin is %d,Max is %d!/n",FindMin(Pos)->Element,FindMax(Pos)->Element);	ExchangeTree(Pos);	VisitTree(Pos);	printf("/n");	LevelOrder(Pos);	printf("/n");	ExchangeTree(Pos);	LevelOrder(Pos);	//VisitTree(Pos);	Pos=MakeEmpty(Pos);	return 0;}

測試結果:先序遍歷與非遞歸實現相同 由中序遍歷可看出樹的鏡像結果


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 黎城县| 永济市| 任丘市| 卓资县| 闻喜县| 卓尼县| 清镇市| 安国市| 贵港市| 密山市| 柳林县| 咸阳市| 奉贤区| 镇江市| 扎赉特旗| 万山特区| 准格尔旗| 峡江县| 苏尼特右旗| 永川市| 东丽区| 长岛县| 苏尼特右旗| 洪洞县| 鲁甸县| 云南省| 鄂托克旗| 保康县| 吉首市| 延吉市| 天等县| 当涂县| 泾源县| 寿宁县| 渭源县| 张家口市| 扶风县| 阿图什市| 丹寨县| 于田县| 太仓市|