二叉树的遍历 先序 中序 后序 遍历和层次遍历

源代码在线查看: 二叉树的遍历.txt

软件大小: 3 K
上传用户: bonylee_java
关键词: 二叉树
下载地址: 免注册下载 普通下载 VIP

相关代码

				建立二叉树,层序、先序遍历
				 悬赏分:20 - 解决时间:2008-6-30 08:09
				用非递归算法,c++语言 
				1、问题描述 
				要求能够输入树的各个结点,并能够输出用不同方法遍历的遍历序列;分别建立建立二叉树存储结构的的输入函数、输出层序遍历序列的函数、输出先序遍历序列的函数; 
				2、要求 
				在上交资料中请写明:存储结构、基本算法(可以使用程序流程图)、源程序、测试数据和结果、算法的时间复杂度、另外可以提出算法的改进方法。
				#include  
				#include "sq_Queue.h" 
				#define M 1000 
				using namespace std; 
				template 
				struct Btnode 
				{T d; 
				Btnode *lchild; 
				Btnode *rchild; 
				}; 
				template 
				class Binary_Tree 
				{private: 
				Btnode *BT; 
				public: 
				Binary_Tree(){BT=NULL;return;} 
				void creat_Binary_Tree(T); 
				void pretrav_Binary_Tree(); 
				void level( ); 
				}; 
				template 
				void Binary_Tree::creat_Binary_Tree(T end) 
				{ 
				Btnode *p; 
				T x; 
				cin>>x; 
				if(x==end) 
				return; p=new Btnode; 
				p->d=x; 
				p->lchild=NULL; 
				p->rchild=NULL; 
				BT=p; 
				creat(p,1,end); 
				creat(p,2,end); 
				return; 
				} 
				template 
				static creat(Btnode *p,int k,T end) 
				{ 
				Btnode *q; 
				T x; 
				cin>>x; 
				if(x!=end) 
				{ 
				q=new Btnode; q->d=x; 
				q->lchild=NULL; 
				q->rchild=NULL; 
				if(k==1) p->lchild=q; if(k==2) p->rchild=q; creat(q,1,end); creat(q,2,end); } 
				return 0; 
				} 
				//————————————前序遍历二叉链表—————————————— 
				template 
				void Binary_Tree::pretrav_Binary_Tree( ) 
				{ 
				Btnode *p; 
				p=BT; 
				pretrav(p); cout				return; 
				} 
				
				template 
				static pretrav(Btnode *p) 
				{ 
				if(p!=NULL) 
				{ 
				cout				return 0; 
				} 
				//————————————按层次遍历二叉链表—————————————— 
				template 
				void Binary_Tree::level( ) 
				{ 
				Btnode *k; 
				sq_Queueq(M); 
				if(BT!=NULL) 
				q.ins_sq_Queue(BT); 
				while(q.flag_sq_Queue( )) 
				{ 
				k=q.del_sq_Queue( ); 
				cout				if(k->lchild!=NULL) q.ins_sq_Queue(k->lchild); 
				if(k->rchild!=NULL) q.ins_sq_Queue(k->rchild); 
				} 
				return; 
				} 
				int main( ) 
				{ 
				Binary_Treeb; cout				b.creat_Binary_Tree(-1); cout				b.pretrav_Binary_Tree( ); 
				cout				b.level( ); 
				再建立一个用户自定义文件sq_Queue,把下面的考进去 
				#include  
				using namespace std; 
				//定义循环队列类 
				template //模板声明,数据元素虚拟类型为T 
				class sq_Queue 
				{private: //数据成员 
				int mm; //存储空间容量 
				int front; //排头指针 
				int rear; //队尾指针 
				int s; //标志 
				T *q; //循环队列存储空间首地址 
				public: //成员函数 
				sq_Queue(int); //构造函数,建立空循环队列 
				void prt_sq_Queue(); //输出排头与队尾指针以及队中元素 
				int flag_sq_Queue(); //检测循环队列的状态 
				void ins_sq_Queue(T); //入队 
				T del_sq_Queue(); //退队 
				}; 
				//建立容量为mm的空循环队列 
				template 
				sq_Queue::sq_Queue(int m) 
				{mm=m; //存储空间容量 
				q=new T[mm]; //动态申请存储空间 
				front=mm; 
				rear=mm; 
				s=0; 
				return; 
				} 
				//输出排头与队尾指针以及队中元素 
				template 
				void sq_Queue::prt_sq_Queue() 
				{int i; 
				cout				cout				if(s==0){cout				return; 
				} 
				i=front; 
				do{i=i+1; 
				if(i==mm+1)i=1; 
				cout				}while(i!=rear); 
				return; 
				} 
				//检测循环队列的状态 
				template 
				int sq_Queue::flag_sq_Queue() 
				{if((s==1)&&(rear==front))return(-1); //存储空间已满,返回-1 
				if(s==0)return(0); //循环队列为空,返回0 
				return(1); //正常返回1 
				} 
				//入队 
				template 
				void sq_Queue::ins_sq_Queue(T x) 
				{if((s==1)&&(rear==front)) //存储空间已满,上溢错误 
				{cout				return; 
				} 
				rear=rear+1; //队尾指针进一 
				if(rear==mm+1)rear=1; 
				q[rear-1]=x; //新元素入队 
				s=1; //入队后队列非空 
				return; 
				} 
				//退队 
				template 
				T sq_Queue::del_sq_Queue() 
				{T y; 
				if(s==0) //队列为空,下溢错误 
				{cout				return(0); 
				} 
				front=front+1; //排头指针进一 
				if(front==mm+1)front=1; 
				y=q[front-1]; //将退队元素赋值给变量 
				if(front==rear)s=0; 
				return(y); //返回退队元素 
				}
				
							

相关资源