亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? binarytree.h

?? 樹跟二叉樹完整試用版 請選擇:(1)建立二叉樹:(2)建立二樹:(3)幫助:(4)退出:
?? H
?? 第 1 頁 / 共 2 頁
字號:
#include<iostream>
#include<math.h>
#include<assert.h>
#include"stack.h"
#include"queue.h"
using namespace std;

struct Level{
	
	int yLevel;
    
	int xIndent;
};

template<typename T>class BinaryTree;

template<typename T>class BinaryTreeNode{

public:

	BinaryTreeNode(T data){element=data; LeftChild=NULL; RightChild=NULL; lTag=0;rTag=0;}

	friend class BinaryTree<T>;
private:

	BinaryTreeNode<T> *LeftChild,*RightChild;

	T element;

	int lTag,rTag;
};

template<typename T>class BinaryTree
{
public:

	BinaryTree(){root=NULL;}

	~BinaryTree();

	void MakeEmpty(){ MakeEmpty(root);}        //清除二叉樹

    int Research(T data);                      //尋找結點

	void CreatTree(T data);                    //建立二叉樹

	void PrintVTree(){ PrintVTree(root);}      //打印圖形二叉樹
	
	void PrinTree(){ PrinTree(root,0);}        //用凹凸法打印圖型二叉樹
	
	void PreOrder(){ PreOrder(root);}          //非遞歸前序遍歷

	void InOrder(){InOrder(root);}              //非遞歸中序遍歷

	void PostOrder(){PostOrder(root);}          //非遞歸后序遍歷

	void COrder(){ COrder(root);}               //層次遍歷

	void Countleaf(int &c){ Countleaf(root,c);} //計算葉結點個數

	int  Depth_queue(){ return Depth_queue(root);} //用隊列求二叉樹深度

	int  Depth_stack(){ return Depth_stack(root);} //用棧求二叉樹深度

	void PackOrder(){PackOrder(root);}         //用括號遍歷二叉樹

	void creatpackettree(char *str);           //用括號建立二叉樹

	void m_creatbrinarytree(T *str,int n);   //建立滿二叉樹
    
	BinaryTreeNode<T>* pre_and_in_creatbinary(char *ppos,char * ipos,int n);//用中序周游跟前序周游建立二叉樹

	void InThread(){ InThread(root);}                //中序線索二叉樹

	void In_thread_Order(){ In_thread_Order(root);}  //中序線索周游二叉樹

	void FindNextinInorderTree(T data){                   //中序線索中找指定結點在前序下的后續
		
        BinaryTreeNode<T> *p;

		p=FindNextinInorderTree(root,data);

		if(p==NULL)
		
			cout<<"\n該結點在前序下沒有后續!"<<endl<<endl; 
		
		else{
			cout<<endl;
		
			cout<<"在中序線索二叉樹中找指定結點在前序下的后綴:"<<p->element<<endl<<endl;
		}
	}
	
	void FindBeforeinInorderTree(T data){                   //中序線索中找指定結點在后序下的前驅
		
        BinaryTreeNode<T> *p;

		p=FindBeforeinInorderTree(root,data);

		if(p==NULL)

			cout<<"\n該結點在后序下沒有前驅!"<<endl<<endl; 
			
		else{
			cout<<endl;
		
			cout<<"在中序線索中找指定結點在后序下的前驅:"<<p->element<<endl<<endl;
		}
	}
	void Post_Thread_Order(){ Post_Thread_Order(root);}  //后序周游中序線索二叉樹

	void Del_BinaryTreeNode(T data){ Del_BinaryTreeNode(root,data);}//排序二叉樹刪除結點

	void Del_BinaryTreeNode_EX(T data){ Del_BinaryTreeNode_EX(root,data);}//改進的二叉樹刪除結點

	void InsertNode_in_Inthread(T find_data,T insert_data){ InsertNode_in_Inthread(root,find_data,insert_data);}//在中序線索二叉樹插入結點

	void Ancestor(T data){ Ancestor(root,data);}//打印指定結點的祖先

	void Closed_Ancestor(T data1,T data2){ Closed_Ancestor(root,data1,data2);}//打印指定兩個結點的最近祖先

	void PreOrder_Ex(){ PreOrder_Ex(root);}//改進的非遞歸前序遍歷,這個遍歷少了一個子循環,高效很多

private:

   BinaryTreeNode<T> *root,*p;

   void MakeEmpty(BinaryTreeNode<T> *t);
   
   void PrintVTree(BinaryTreeNode<T> *t);

   void PrinTree(BinaryTreeNode<T> *b,int level);
   
   void PreOrder(BinaryTreeNode<T> *t);

   void InOrder(BinaryTreeNode<T> *t);

   void PostOrder(BinaryTreeNode<T> *t);

   void COrder(BinaryTreeNode<T> *t);

   void Countleaf(BinaryTreeNode<T> *t,int &c);

   int Depth_queue(BinaryTreeNode<T> *t);

   int Depth_stack(BinaryTreeNode<T> *t);

   void PackOrder(BinaryTreeNode<T> *t);

   void InThread(BinaryTreeNode<T> *t);

   void In_thread_Order(BinaryTreeNode<T> *t);

   BinaryTreeNode<T> *FindNextinInorderTree(BinaryTreeNode<T> *t,T data);

   BinaryTreeNode<T> *FindBeforeinInorderTree(BinaryTreeNode<T> *t,T data);

   void Post_Thread_Order(BinaryTreeNode<T> *t);

   BinaryTreeNode<T>* Is_PostOrder_first_Node(BinaryTreeNode<T> *t);//判斷是否后序周游中序線索二叉樹的第一個結點

   void Del_BinaryTreeNode(BinaryTreeNode<T> *t,T data);

   void Del_BinaryTreeNode_EX(BinaryTreeNode<T> *t,T data);

   void InsertNode_in_Inthread(BinaryTreeNode<T> *t,T find_data, T insert_data);

   void Ancestor(BinaryTreeNode<T> *t,T data);

   void Closed_Ancestor(BinaryTreeNode<T> *t,T data1,T data2);

   void PreOrder_Ex(BinaryTreeNode<T> *t);

};

template<typename T>BinaryTree<T>::~BinaryTree()
{
	MakeEmpty(root);
}

template<typename T>void BinaryTree<T>::MakeEmpty(BinaryTreeNode<T> *t)
{
	if(t!=NULL)
	{
		if(t->lTag==0)

		MakeEmpty(t->LeftChild);

		if(t->rTag==0)

		MakeEmpty(t->RightChild);

		delete t;
	}
}

template<typename T>int BinaryTree<T>::Research(T data)
{
	BinaryTreeNode<T> *ptr=root;

	p=NULL;

	while(ptr)
	{
		if(ptr->element==data) {p=ptr; return 1;}
		
		if(ptr->element>data)
		{
			p=ptr;

			ptr=ptr->LeftChild;
		}

		else{
			p=ptr;

			ptr=ptr->RightChild;
		}
	}

	return 0;
}
template<typename T> void BinaryTree<T>::CreatTree(T data)
{
	BinaryTreeNode<T> *current;
	
	if(Research(data)==0)
	{
       
	 current=new BinaryTreeNode<T>(data);

	 if(p==NULL) root=current;

	 else if(p->element>data)
	 
		 p->LeftChild=current;

	 else p->RightChild=current;
	}
}

template<typename T>void BinaryTree<T>::PrintVTree(BinaryTreeNode<T> *t){
	
	int screenWidth=64;
	
	int dataWidth=2;
	
	queue<BinaryTreeNode<T> *> Q;
	
	queue<Level> QI;
	
	BinaryTreeNode<T> *p;
	
	Level s,s1,s2;
	
	double offset,level=-1,i;
	
	Q.EnQue(t);
	
	s.xIndent=screenWidth/dataWidth;
	
	s.yLevel=0;
	
	QI.EnQue(s);
	
	while(!Q.IsEmpty()&&!QI.IsEmpty())
	{
		s2=s;
		
		p=Q.DeQue();
		
		s=QI.DeQue();
		
		if(s.yLevel!=level){
		
			cout<<"\n\n第"<<s.yLevel<<"層";
			
			level=s.yLevel;
			
			for(i=0;i<s.xIndent-1;i++) cout<<" ";
		}
		else	
			for(i=0;i<s.xIndent-s2.xIndent;i++) cout<<" ";
		
		cout<<p->element;
		
		if(p->LeftChild!=NULL)
		{
			Q.EnQue(p->LeftChild);
			
			s1.yLevel=s.yLevel+1;
			
			offset=screenWidth/pow(dataWidth,s1.yLevel+1);
			
			s1.xIndent=s.xIndent-offset;
			
			QI.EnQue(s1);
		}
		 if(p->RightChild!=NULL)
		 { 
		 
			Q.EnQue(p->RightChild);
			
			s1.yLevel=s.yLevel+1;
			
			offset=screenWidth/pow(dataWidth,s1.yLevel+1);
			
			s1.xIndent=s.xIndent+offset;
			
			QI.EnQue(s1);
		}
	}
}

template<typename T>void BinaryTree<T>::PrinTree(BinaryTreeNode<T> *b,int level){
	if(b!=NULL)
	{
		PrinTree(b->RightChild,level+1);
		if(level!=0){
			for(int i=0;i<6*(level-1);i++)cout<<" ";
			cout<<"-----";
		}
		cout<<b->element<<endl;
		PrinTree(b->LeftChild,level+1);
	}
}


template<typename T>void BinaryTree<T>::PreOrder(BinaryTreeNode<T> *t)
{
	stack<BinaryTreeNode<T>*> s;

	BinaryTreeNode<T> *p=t;

	while(!s.IsEmpty()||p!=NULL)
	{
        while(p)
		{
			s.Push(p);
			
			cout<<p->element<<'\t';
			
			p=p->LeftChild;
		}
	p=s.Pop();

	p=p->RightChild;
	}
}

template<typename T>void BinaryTree<T>::InOrder(BinaryTreeNode<T> *t)
{
   stack<BinaryTreeNode<T>*> s;

	BinaryTreeNode<T> *p=t;

	while(!s.IsEmpty()||p!=NULL)
	{
        while(p)
		{
			s.Push(p);
			
			p=p->LeftChild;
		}
	p=s.Pop();

	cout<<p->element<<'\t';

	p=p->RightChild;
	}
}

template<typename T>void BinaryTree<T>::PostOrder(BinaryTreeNode<T> *t)
{
    stack<BinaryTreeNode<T>*> s;

	BinaryTreeNode<T> *p=t;

	int tag[255],top=-1;
	
	while(!s.IsEmpty()||p!=NULL)
	{
        while(p)
		{
			s.Push(p);
			
			tag[++top]=0;
			
			p=p->LeftChild;
		}
	if(top>-1)

		if(tag[top]==1)
        
		{
			cout<<s.GetTop()->element<<'\t';

			s.Pop();

			top--;
		}
		else{

			p=s.GetTop();

			tag[top]=1;

			p=p->RightChild;
		}
	}
}

template<typename T>void BinaryTree<T>::COrder(BinaryTreeNode<T> *t)
{

	BinaryTreeNode<T> *p;

	p=t;

	queue<BinaryTreeNode<T> *> Q;

	Q.EnQue(p);

	while(!Q.IsEmpty())
	{
		p=Q.DeQue();

		cout<<p->element<<"\t";

		if(p->LeftChild!=NULL)

			Q.EnQue(p->LeftChild);

		if(p->RightChild!=NULL)

			Q.EnQue(p->RightChild);
	}

}
template<typename T>void BinaryTree<T>::Countleaf(BinaryTreeNode<T> *t,int &c)
{
	 
 stack<BinaryTreeNode<T>*> s;

	BinaryTreeNode<T> *p=t;

	int tag[255],top=-1;
	
	while(!s.IsEmpty()||p!=NULL)
	{
        while(p)
		{
			s.Push(p);
			
			tag[++top]=0;
			
			p=p->LeftChild;
		}
	if(top>-1)

		if(tag[top]==1)
        
		{
			if(s.GetTop()->LeftChild==NULL && s.GetTop()->RightChild==NULL)

				c++;

			s.Pop();

			top--;
		}
		else{

			p=s.GetTop();

			tag[top]=1;

			p=p->RightChild;
		}
	}
}

template<typename T>int  BinaryTree<T>::Depth_queue(BinaryTreeNode<T> *t)
{
	queue<BinaryTreeNode<T> *> Q;

	queue<Level> QI;

	int depth;
	
	Level y,y1;

	BinaryTreeNode<T> *p=t;

	y.yLevel=1;

	Q.EnQue(p);

	QI.EnQue(y);

	while(!Q.IsEmpty())
	{
		p=Q.DeQue();

		y=QI.DeQue();

		if(p->LeftChild!=NULL)
		{
			Q.EnQue(p->LeftChild);

			y1.yLevel=y.yLevel+1;

		    QI.EnQue(y1);
		}

		if(p->RightChild!=NULL)
		{
			Q.EnQue(p->RightChild);

			y1.yLevel=y.yLevel+1;

		    QI.EnQue(y1);
		}
	}
	
	depth=y.yLevel;
	
	return depth;
}

template<typename T>int  BinaryTree<T>::Depth_stack(BinaryTreeNode<T> *t)
{
    stack<BinaryTreeNode<T>*> S;
	
	BinaryTreeNode<T> *p;
	
	int tag[100],top=-1;
	
	p=t;

    stack<Level> s,s1;   //s1是用來記錄當前有左右孩子的結點的高讀

	Level y,y1,temp;

	temp.yLevel=0;
	
	y.yLevel;

	while(p!=NULL||!S.IsEmpty()){
		
		while(p!=NULL){
			
			S.Push(p);
			
			y.yLevel=0;

			s.Push(y);
			
			tag[++top]=0;
			
			p=p->LeftChild;
		}
		if(top>-1)
			
			if(tag[top]==1)
			{
				
			
				y=s.Pop();


				if(S.GetTop()->LeftChild!=NULL&&S.GetTop()->RightChild!=NULL)
				{
					temp=s1.Pop();
					
					if(temp.yLevel>y.yLevel)
					
						s.Push(temp);
				
				    else{

				    y1.yLevel=y.yLevel+1;
					
					s.Push(y1);
				
				}	
				
				}
				else{

				    y1.yLevel=y.yLevel+1;
					
					s.Push(y1);
				
				}	

			
				
				S.Pop();
				
				top--;
			}
			else {
				
					p=S.GetTop();

					if(p->LeftChild!=NULL&&p->RightChild!=NULL)//當這個結點是它左孩子的后續并且這個結點有右孩子
					{
					   y=s.Pop();

					   y1.yLevel=y.yLevel+1;

					   s1.Push(y1);

					   temp=y1;

					   
					}
					
					tag[top]=1;
					
				    p=p->RightChild;
					
					
				}
			}
    
	y=s.Pop();

	return y.yLevel;
}


template<typename T>void BinaryTree<T>::creatpackettree(char *str)
{
	BinaryTreeNode<T> *p;

	stack<BinaryTreeNode<T> *> s;
      
	int k,i=0;
      
    char ch=str[i];

	while(ch!='\0')
	{
		switch(ch)
		{
		case '(': s.Push(p); k=1; break;

		case ')': s.Pop(); break;

		case ',': k=2; break;

		default:

			p=new BinaryTreeNode<T>(ch);

			if(root==NULL)

			root=p;

			else{

			    switch(k)
				{
				case 1: s.GetTop()->LeftChild=p; break;

				case 2: s.GetTop()->RightChild=p; break;
				}
			}
		}
		i++;

		ch=str[i];
	}
}

template<typename T>void BinaryTree<T>::PackOrder(BinaryTreeNode<T> *t)
{
  if(t!=NULL)
  {
	  cout<<t->element;

	  if(t->LeftChild!=NULL||t->RightChild!=NULL)
	  {
		  cout<<"(";

		  PackOrder(t->LeftChild);

		  if(t->RightChild!=NULL)

			  cout<<",";

		  PackOrder(t->RightChild);

		  cout<<")";
	  }
  }
}

template<typename T>void BinaryTree<T>::m_creatbrinarytree(T *str,int n)//根據滿二叉樹的性質,2i為左孩子,2i+1為右孩子
{ 
   queue<BinaryTreeNode<T>*> q;

   BinaryTreeNode<T> *p,*p1;

   int i=1;

   p=new BinaryTreeNode<T>(str[i-1]);

   root=p;

   q.EnQue(root);

   while(i<n)
   {
      p1=q.DeQue();
	  
	  if(2*i-1<n)
	  {
		  p=new BinaryTreeNode<T>(str[2*i-1]);

		  p1->LeftChild=p;

		  q.EnQue(p1->LeftChild);
	  }
	  if(2*i<n)
	  {
           p=new BinaryTreeNode<T>(str[2*i]);

		  p1->RightChild=p;

		  q.EnQue(p1->RightChild);
	  }
      	  
	  i++;
   }
}

template<typename T>BinaryTreeNode<T> * BinaryTree<T>::pre_and_in_creatbinary(char *ppos,char *ipos,int n)
{
	char *rpos;

	int k;

	BinaryTreeNode<T> *p;

	if(n<=0)

		return NULL;

         p=new BinaryTreeNode<T>(*ppos);

		 for(rpos=ipos;rpos<ipos+n;rpos++)

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
色综合一区二区| 国产日本欧美一区二区| 在线国产电影不卡| 精品一区在线看| 日韩成人一级大片| 舔着乳尖日韩一区| 亚洲已满18点击进入久久| 亚洲欧洲国产专区| 中文字幕中文在线不卡住| 国产日产欧美精品一区二区三区| 精品国精品自拍自在线| 日韩一级在线观看| 日韩欧美区一区二| 日韩一区二区视频在线观看| 91麻豆精品国产自产在线观看一区 | 欧美成人性战久久| 欧美精品日韩一本| 日韩一级片网站| 亚洲精品一线二线三线| 精品免费国产二区三区| www欧美成人18+| 2023国产精华国产精品| 国产日韩精品久久久| 中文字幕在线不卡视频| 自拍av一区二区三区| 亚洲免费在线播放| 亚洲国产视频网站| 人禽交欧美网站| 精品一区中文字幕| 国产成人在线网站| 91老师国产黑色丝袜在线| 91久久精品一区二区三| 欧美色男人天堂| 91精品午夜视频| 久久综合九色综合欧美98| 国产欧美日韩精品a在线观看| 国产精品嫩草99a| 亚洲国产精品成人综合| 日韩理论片一区二区| 亚洲成人动漫在线免费观看| 日本不卡视频在线| 国产精品18久久久久久久久久久久| 成人免费视频app| www.欧美.com| 色婷婷激情一区二区三区| 5858s免费视频成人| 久久综合狠狠综合久久激情| 中文字幕av资源一区| 亚洲第一电影网| 国内精品伊人久久久久av一坑 | 97精品久久久午夜一区二区三区 | 国产欧美精品国产国产专区 | 日日夜夜免费精品视频| 韩国视频一区二区| 99精品国产99久久久久久白柏| 欧美午夜精品电影| 久久久www成人免费无遮挡大片| 日韩一区在线播放| 蜜桃视频一区二区三区 | 欧美视频一区二区三区四区| 日韩免费福利电影在线观看| 最好看的中文字幕久久| 天堂一区二区在线免费观看| 国产成人啪午夜精品网站男同| 99精品在线观看视频| 欧美一区二区三区思思人| 欧美国产日本韩| 免费在线一区观看| 97精品国产露脸对白| 欧美电视剧免费全集观看| 亚洲免费观看高清完整版在线| 免费成人av在线| 97国产精品videossex| 久久综合九色综合欧美98| 自拍偷拍国产精品| 国产精品18久久久久久久久| 欧美色图免费看| 国产欧美日韩精品在线| 日本伊人精品一区二区三区观看方式| 丰满白嫩尤物一区二区| 欧美三级电影在线看| 国产精品久久久久久久久搜平片 | 亚洲欧洲成人自拍| 美国毛片一区二区三区| 精品视频123区在线观看| 亚洲国产精品av| 激情伊人五月天久久综合| 成人高清免费在线播放| 欧美日韩国产天堂| 亚洲六月丁香色婷婷综合久久 | 91精品在线免费观看| 亚洲视频资源在线| 高清不卡在线观看| 26uuu国产一区二区三区| 亚洲国产一二三| 色综合色综合色综合色综合色综合 | 久久国产精品99久久久久久老狼| 日本伦理一区二区| 中文字幕亚洲一区二区av在线| 九九国产精品视频| 日韩久久精品一区| 蜜臀精品久久久久久蜜臀| 欧美老肥妇做.爰bbww| 亚洲高清不卡在线观看| 91国产福利在线| 亚洲精品视频在线看| av在线播放一区二区三区| 久久天天做天天爱综合色| 久久99精品国产麻豆婷婷洗澡| 69久久99精品久久久久婷婷| 亚洲小说欧美激情另类| 色婷婷综合久久久中文一区二区| 国产丝袜欧美中文另类| 精品中文av资源站在线观看| 欧美一级日韩一级| 日韩va欧美va亚洲va久久| 91精品婷婷国产综合久久性色 | 亚洲女人的天堂| 99国产精品国产精品久久| 国产精品麻豆久久久| 国产99久久久精品| 欧美大胆一级视频| 美女视频一区在线观看| 欧美精品 日韩| 亚洲va欧美va人人爽| 欧美日韩高清在线播放| 午夜视频在线观看一区二区三区 | 欧美—级在线免费片| 大尺度一区二区| 国产精品女主播av| 91亚洲精华国产精华精华液| 国产精品女上位| 丁香婷婷综合激情五月色| 中文在线资源观看网站视频免费不卡| 国产黄色91视频| 欧美国产日韩在线观看| 一道本成人在线| 亚洲成人av一区二区| 日韩欧美中文一区| 国产99精品国产| 亚洲免费在线播放| 在线不卡一区二区| 国精品**一区二区三区在线蜜桃| 欧美激情一区二区三区四区| 91麻豆123| 蜜桃av噜噜一区二区三区小说| 久久久久久久久久久电影| 成人深夜福利app| 亚洲成av人片在线观看| 亚洲精品一区二区三区福利| 成人性生交大片免费看中文| 亚洲卡通欧美制服中文| 欧美日韩精品久久久| 性久久久久久久| 欧美一区二区成人6969| 国产成人综合在线| 一区二区三区在线免费观看| 日韩一区二区在线观看| 成人免费精品视频| 性做久久久久久| 国产欧美一区二区在线| 欧美一级生活片| 福利电影一区二区| 日韩精品电影在线| 国产欧美精品一区二区色综合| 欧美影院精品一区| 国产成人综合网| 天天综合色天天| 国产精品天干天干在观线| 91精品国产综合久久精品| av男人天堂一区| 卡一卡二国产精品| 亚洲另类中文字| 久久久美女艺术照精彩视频福利播放| 91污片在线观看| 久久99久久99| 五月激情综合色| 亚洲午夜日本在线观看| 综合网在线视频| 欧美激情一区不卡| 久久精品亚洲乱码伦伦中文| 欧美一区二区三区四区视频| 欧美三级韩国三级日本一级| 91蜜桃免费观看视频| 99久久综合精品| 成人福利视频在线看| 国产99久久久国产精品免费看| 精品一区二区三区在线视频| 日韩黄色片在线观看| 亚洲午夜精品17c| 亚洲图片欧美色图| 亚洲一区二区三区四区在线观看 | 久久精品久久99精品久久| 性久久久久久久久久久久| 亚洲一区二区三区中文字幕 | 一区二区三区精品在线| 国产精品天美传媒沈樵| 欧美国产精品中文字幕| 中文字幕第一区第二区| 国产精品视频麻豆|