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

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

?? p236.cpp

?? 清華大學-數據結構(課件+習題+課后答案)
?? CPP
字號:
#include <iostream.h>
#include "P170.cpp"
#include "Stack.h"
const MaxN=30;
template <class Type> class BST;							//二叉搜索樹的前視聲明

template <class Type> class BstNode : public BinTreeNode<Type> {			//二叉搜索樹結點類
friend class BST;
public:
   BstNode ( const Type d=0, BstNode *L=NULL, BstNode *R =NULL)			//構造函數
      : data (d), leftChild (L), rightChild (R) { };
   ~BstNode ( ) { }
   friend class BST<Type>;
protected:
   Type data;										//數據域(用作關鍵碼)
   BstNode<Type> *leftChild, *rightChild;						//左子女和右子女鏈域
};

template <class Type> class BST : BinaryTree <Type> {					//二叉搜索樹類定義
public:
	BST ( ) :root(NULL){};								//構造函數
   BST ( Type value ) ;
   BST (const BST<Type> & T) ;//構造函數
   ~BST ( ) { MakeEmpty (  ); }							//析構函數
   const BST & operator = ( const BST & Value );
   void MakeEmpty( ) { destroy (root);  root=NULL; }
   void PrintTree ( ) const { PrintTree ( root ); }
   int Find ( const Type & x ) const { return (Find ( x, root )!=NULL) ; }	//搜索元素
   Type Min() { return Min(root)->data;};										//求最小
   Type Max() { return Max(root)->data;};										//求最大
   int Insert ( const Type & x ) { return Insert ( x, root ); }				//插入新元素
   int Remove (const Type & x ) { return Remove ( x, root ); }				//刪除含x的結點
   BstNode<Type> *Split ( Type i, BST<Type> &B, Type &x, BST<Type> &C );
   void OpticBST ( int p[ ], int q[ ], Type a[ ], int n );
   friend class BSTIterator ;//中序游標類
   
private:											//在關鍵碼i處分解二叉搜索樹
   BstNode<Type> *root;								//二叉搜索樹的根指針
   Type RefValue;										//數據輸入停止的標志, 用于輸入
   BstNode<Type> *lastfound;								//最近搜索到的結點的指針
//   void MakeEmpty ( BstNode<Type> * ptr );					//置空
   int Insert ( const Type & x, BstNode<Type> * & ptr );			//插入
   int Remove ( const Type & x, BstNode<Type> * & ptr );			//刪除
   void PrintTree ( BstNode<Type> * ptr ) const;					//打印
   BstNode<Type> *Copy (const BstNode<Type> * ptr );				//復制
   BstNode<Type> *Find (const Type & x, BstNode<Type> * ptr ) const;	//搜索
   BstNode<Type> *Min ( BstNode<Type> * ptr ) const;				//求最小
   BstNode<Type> *Max ( BstNode<Type> * ptr ) const;				//求最大 
};
/*
template <class Type> 
BstNode<Type> * BST<Type>::Find (const Type & x, BstNode<Type> * ptr ) const {
//私有函數:在以ptr為根的二叉搜索樹中搜索含x的結點。若找到,則函數返回該結點的地址,否則函數返回
//NULL值。
   if ( ptr == NULL ) return NULL;
   else if ( x < ptr->data ) return Find ( x, ptr->leftChild );			//到左子樹中繼續搜索
	 else if ( x > ptr->data ) return Find( x, ptr->rightChild );			//到右子樹中繼續搜索
	    else return ptr;								//搜索成功
}
*/
template <class Type> BstNode<Type> *BST<Type>::Find (const Type & x, BstNode<Type> * ptr ) const {
//私有函數: 說明與程序7.14相同
   if ( ptr != NULL ) {									//樹空返回
	 BstNode<Type> * temp = ptr;							//從根開始搜索
	 while ( temp != NULL ) {								//==NULL表示搜索失敗
	    if ( temp->data == x ) return temp;					//搜索成功
	    if ( temp->data < x ) temp = temp->rightChild;				//否則,繼續搜索右子樹
	    else temp = temp->leftChild;						//否則,繼續搜索左子樹
	 }
   }
   return NULL;
};
template <class Type> int BST<Type>::
Insert (const Type & x, BstNode<Type> * & ptr) {
//私有函數:在以ptr為根的二叉搜索樹中插入所含值為x的結點。若在樹中已經有含x的結點,則不插入。
   if ( ptr == NULL )	{							//新結點作為葉結點插入
	 ptr = new BstNode<Type> (x);						//創建新結點
	 if ( ptr == NULL ) return 0; else return 1;
   }
   else if ( x < ptr->data ) return Insert ( x, ptr->leftChild );			//小于根的關鍵碼, 向左子樹插入
	 else if ( x > ptr->data ) return Insert ( x, ptr->rightChild );		//大于, 向右子樹插入
   return 1;
							//除上述情況外, 就是x已在樹中的情形, 不再插入
}



template <class Type>BST<Type>::BST ( Type value ) {
//輸入一個元素序列, 建立一棵二叉搜索樹
   Type x;  root = NULL;  RefValue = value;			//置空樹
   cin >> x;									//輸入數據
   while ( x != RefValue )
   {						//RefValue是一個輸入結束標志
      Insert ( x, root );  cin >> x;					//插入,再輸入數據
   }
}

template <class Type>
void BST<Type>::PrintTree ( BstNode<Type> * ptr ) const					//打印
{
	if (ptr!=NULL)
	{
		cout<<ptr->data;
		cout<<"(";
		PrintTree(ptr->leftChild);
		cout<<",";
		PrintTree(ptr->rightChild);
		cout<<")";
	}
}


template <class Type> int BST<Type>::Remove (const Type &x, BstNode<Type> * &ptr) {
//私有函數:在以ptr為根的二叉搜索樹中刪除含x的結點。若刪除成功則新根通過ptr返回。
   BstNode<Type> * temp;
   if ( ptr != NULL )
	if ( x < ptr->data ) return Remove ( x, ptr->leftChild );				//在左子樹中執行刪除
	else if ( x > ptr->data )  return Remove ( x, ptr->rightChild );			//在右子樹中執行刪除
	   else if ( ptr->leftChild != NULL && ptr->rightChild != NULL )	{
						// ptr指示關鍵碼為x的結點,它有兩個子女
		   temp = Min ( ptr->rightChild );					//在ptr的右子樹中搜尋最小結點
		   ptr->data = temp->data;						//用該結點數據代替根結點數據
		   return Remove ( ptr->data, ptr->rightChild );				//在右子樹中刪除該結點
		 }
		 else {				// ptr指示關鍵碼為x的結點,它只有一個或零個子女
			  temp = ptr;
			  if ( ptr->leftChild == NULL ) ptr = ptr->rightChild;		//只有右子女
			  else if ( ptr->rightChild == NULL ) ptr = ptr->leftChild;	//只有左子女
		      delete temp;
		      return 1;
		    }
   else return 0;
}
template <class Type> class InorderIterator	{	    			//中序游標類定義
public:
   InorderIterator ( BST<Type> & Tree ) : ref (Tree) { Init ( ); }
   int Init ( );									//初始化
   int operator ! ( );								//求反
   Type operator ( ) ( );								//取棧頂元素值
   int operator ++ ( );								// BST按前序進行遍歷
private:
   BST<Type> & ref;								//二叉搜索樹對象
   Stack < BstNode<Type> * > itrStack;					//迭代工作棧
};

template <class Type> int InorderIterator<Type>::Init ( ) {			//初始化操作
   itrStack.MakeEmpty ( );								//置迭代工作棧為空
   if ( ref.root != NULL ) itrStack.Push ( ref.root );				//若二叉搜索樹不空則根指針進棧
   return ! itrStack.IsEmpty ( );							//若棧空則返回0,否則返回1
}

template <class Type> int InorderIterator<Type>::operator ! ( ) {
   return ! itrStack.IsEmpty ( );							//若棧空則返回0,否則返回1
}

template <class Type> Type InorderIterator<Type>::operator ( ) ( ) {	//返回當前結點的數據值
   Node<Type> * current = itrStack.GetTop ( );				//取棧頂結點為當前結點
   return current->data;								//返回當前結點的關鍵碼
}

template <class Type> int InorderIterator<Type>::operator ++ ( ) {
//按二叉搜索樹結點的前序序列進棧。還可以向前走則函數返回1, 否則返回0。
   BstNode<Type> * current = itrStack.GetTop ( );				//取存在棧頂上的結點
   BstNode<Type> * next = current->leftChild;				//左子女
   if ( next != NULL ) { itrStack.Push ( next );  return 1; }			//左子女非空, 進棧(向左子樹遍歷)
   while ( ! itrStack.IsEmpty ( ) ) {						//否則, 若棧非空
      current = itrStack.Pop ( );   next = current->rightChild;		//退棧, 取其右子女
      if ( next != NULL ) { itrStack.Push ( next );  return 1; }		//右子女非空, 進棧
   }
   return 0;
}

/*template <class Type>
BST<Type>::BST (const BST<Type> & T) : root (NULL) {
//構造函數:根據參數初始化樹T
   InorderIterator<Type> itr ( Type );						//聲明中序游標類對象
   for ( itr.init ( ); ! itr; itr++) Insert ( itr ( ) );				//按前序順序插入
}*/

template <class Type>
BstNode<Type> * BST<Type>::Min ( BstNode<Type> * ptr ) const				//求最小
{
  BstNode<Type> * temp1,*temp2;
  temp1=ptr;
  if (ptr!=NULL)
  {
    if (ptr->leftChild!=NULL)
    {
	temp2=Min(ptr->leftChild);
	if (temp1->data>temp2->data) temp1=temp2;
    }
    if (ptr->rightChild!=NULL)
    {
	temp2=Min(ptr->rightChild);
	if (temp1->data>temp2->data) temp1=temp2;
    }
  }
  return temp1;
}

template <class Type>
BstNode<Type> * BST<Type>::Max ( BstNode<Type> * ptr ) const				//求最小
{
  BstNode<Type> * temp1,*temp2;
  temp1=ptr;
  if (ptr!=NULL)
  {
    if (ptr->leftChild!=NULL)
    {
	temp2=Max(ptr->leftChild);
	if (temp1->data<temp2->data) temp1=temp2;
    }
    if (ptr->rightChild!=NULL)
    {
	temp2=Max(ptr->rightChild);
	if (temp1->data<temp2->data) temp1=temp2;
    }
  }
  return temp1;
}


template <class Type> void BST<Type>::OpticBST ( int p[ ], int q[ ], Type a[ ], int n ) {
//給定n個不同的數據 a[1] < a[2] < … < a[n], 以及它們具有的權值p[j], 1 ( j ( n, 另外落在它們之間外部
//結點上的權值分別為 q[i], 0 ( i ( n。本算法計算a[i+1], ……, a[j]的最優二叉搜索樹T[i][j]的代價C[i][j],
//T[i][j]的根R[i][j]和權W[i][j]。
   int R[MaxN+1][MaxN+1];
   int C[MaxN+1][MaxN+1];
   int W[MaxN+1][MaxN+1];
   for ( int i=0; i<n; i++) 
   {
	 W[i][i] = q[i];  C[i][i] = R[i][i] = 0;		//初始化
	 W[i][i+1] = W[i][i] + p[i+1] + q[i+1];		//構造只有一個內部結點, 兩個外部結點的最優二叉搜索樹
	 R[i][i+1] = i+1;					//這些樹的根在i+1
	 C[i][i+1] = W[i][i+1];				//這些樹的總帶權路徑長度(代價)
   }
   W[n][n] = q[n];  R[n][n] = C[n][n] = 0;
   for ( int m=2; m<=n; m++ )				//構造具有m個內部結點的最優二叉搜索樹
	 for ( i=0; i<=n-m; i++ ) 
	 {
	   int j = i + m;   W[i][j] = W[i][j-1] + p[j] + q[j];  //在前一棵樹基礎上再加一內部結點和一外部結點
	   int min = C[i+1][j],  u = i+1;			//假定i+1為根, 計算代價
	   for ( int k=i+2; k<=j; k++ )
   		if ( C[i][k-1] + C[k][j] < min ) 
		{ min = C[i][k-1] + C[k][j];  u = k; }
									//輪流以i+2,…,j為根, 選代價最小的送min, 其根為u
		C[i][j] = W[i][j] + min;  R[i][j] = u;
	 }
    Stack < int > nodeStack;
	MakeEmpty();
	nodeStack.Push(0);
	nodeStack.Push(n);
	while (!nodeStack.IsEmpty()) 
	{
		int j=nodeStack.Pop();
		int i=nodeStack.Pop();
		Insert(a[R[i][j]]);
		if ((i+1)<R[i][j])
		{
			nodeStack.Push(i);
			nodeStack.Push(R[i][j]-1);
		};
		if ((R[i][j])<j)
		{
			nodeStack.Push(R[i][j]);
			nodeStack.Push(j);
		};
	}
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产午夜亚洲精品理论片色戒| 中文字幕不卡三区| 6080午夜不卡| 国产精品视频麻豆| 日韩av电影天堂| 91麻豆6部合集magnet| 欧美激情一区在线观看| 粉嫩嫩av羞羞动漫久久久 | 日韩美女天天操| 亚洲欧洲韩国日本视频| 精品一区二区三区在线播放视频| 97se亚洲国产综合自在线不卡| 日韩精品一区在线| 首页国产丝袜综合| 在线亚洲精品福利网址导航| 国产精品日产欧美久久久久| 韩国精品一区二区| 日韩欧美黄色影院| 日本欧美一区二区在线观看| 色综合久久久久综合| 欧美激情一区二区三区不卡 | 国产精品毛片无遮挡高清| 亚洲已满18点击进入久久| jizzjizzjizz欧美| 久久九九久久九九| 色综合天天综合网天天看片| 久久久高清一区二区三区| 蜜桃精品视频在线| 欧美一级淫片007| 日韩av一二三| 日韩视频免费观看高清完整版在线观看 | 在线不卡免费欧美| 夜夜揉揉日日人人青青一国产精品| 99在线视频精品| 中文字幕精品一区二区精品绿巨人 | 欧美精品一二三区| 午夜久久久久久久久| 欧美日韩亚洲另类| 五月婷婷综合激情| 日韩一区和二区| 国内精品自线一区二区三区视频| 久久先锋资源网| 成人一级视频在线观看| 亚洲欧洲三级电影| 欧美图区在线视频| 午夜av一区二区| 欧美一级日韩免费不卡| 九色|91porny| 久久久99精品免费观看不卡| 成人黄页毛片网站| 亚洲乱码国产乱码精品精98午夜| 色成年激情久久综合| 亚洲一区日韩精品中文字幕| 欧美日本乱大交xxxxx| 久久99精品国产91久久来源| 国产欧美1区2区3区| 色婷婷久久久亚洲一区二区三区| 亚洲成人动漫精品| 日韩区在线观看| 成人app网站| 亚洲午夜私人影院| 亚洲第一福利一区| 日韩精品一区二区三区蜜臀| 成人在线视频一区| 一区二区三区四区视频精品免费| 欧美一区二区私人影院日本| 国产精品一区一区| 亚洲精品成人少妇| 精品国产a毛片| 97精品视频在线观看自产线路二| 丝袜亚洲另类丝袜在线| 日本一区二区三区高清不卡| 日本道色综合久久| 久久99精品久久只有精品| 亚洲欧美日韩人成在线播放| 日韩欧美资源站| 91浏览器打开| 久久99精品国产91久久来源| 1000部国产精品成人观看| 日韩欧美一区二区视频| 91网址在线看| 国产一区二区三区四区五区入口| 一区二区三区美女| 国产欧美日韩不卡| 日韩视频中午一区| 欧美性感一区二区三区| 丁香一区二区三区| 亚洲成av人片在线| 最近日韩中文字幕| 精品少妇一区二区三区在线播放| 色哟哟一区二区在线观看 | 国产成人精品三级| 青草国产精品久久久久久| 一区二区三区在线播| 国产精品对白交换视频| 日韩精品一区二区三区视频| 欧美日韩高清影院| 色天天综合色天天久久| 国产超碰在线一区| 久久激情五月激情| 日日摸夜夜添夜夜添亚洲女人| 亚洲黄色尤物视频| 中文字幕亚洲在| 国产欧美日韩综合精品一区二区| 日韩一区二区在线看片| 欧美三级电影网站| 91国偷自产一区二区三区观看| 91免费视频观看| 成人国产精品免费网站| 成人亚洲精品久久久久软件| 国产一区中文字幕| 国产呦萝稀缺另类资源| 狠狠色综合色综合网络| 精品综合久久久久久8888| 日韩av不卡在线观看| 日韩1区2区日韩1区2区| 蜜桃一区二区三区在线| 免费一级欧美片在线观看| 久久精品国产秦先生| 麻豆中文一区二区| 开心九九激情九九欧美日韩精美视频电影| 图片区日韩欧美亚洲| 亚洲丰满少妇videoshd| 日韩在线播放一区二区| 日韩电影免费在线看| 另类综合日韩欧美亚洲| 韩国成人福利片在线播放| 国产麻豆视频一区| 成人永久看片免费视频天堂| 色综合激情五月| 欧美视频一区在线| 欧美一区二区三区喷汁尤物| 日韩欧美中文一区二区| 亚洲精品一区二区三区影院 | 亚洲男人的天堂一区二区| 伊人婷婷欧美激情| 天堂久久一区二区三区| 另类的小说在线视频另类成人小视频在线| 麻豆成人av在线| 国产精品一区二区果冻传媒| 91亚洲国产成人精品一区二三| 欧洲亚洲国产日韩| 精品免费国产二区三区 | 婷婷久久综合九色综合伊人色| 日韩中文字幕区一区有砖一区 | 色婷婷久久一区二区三区麻豆| 欧美色成人综合| 26uuu久久天堂性欧美| 亚洲欧美日韩久久| 日韩高清在线一区| 不卡的av在线播放| 91麻豆精品国产自产在线观看一区| 精品精品国产高清一毛片一天堂| 国产精品成人一区二区三区夜夜夜| 亚洲综合久久久久| 国产一区二区在线视频| 欧美影院午夜播放| 亚洲精品在线电影| 亚洲成人一二三| 不卡电影一区二区三区| 91精品国产欧美一区二区成人| 中文字幕av一区二区三区免费看 | 欧美一区二区私人影院日本| 国产精品美女www爽爽爽| 奇米色一区二区三区四区| voyeur盗摄精品| 精品少妇一区二区三区免费观看| 亚洲一区av在线| 豆国产96在线|亚洲| 欧美一区二区三区影视| 一区二区三区欧美激情| 国产酒店精品激情| 911精品国产一区二区在线| 亚洲色图视频网| 国产一区视频网站| 91精品中文字幕一区二区三区| 亚洲人成7777| 成人精品免费看| 久久精品男人的天堂| 蜜臀91精品一区二区三区| 欧美羞羞免费网站| 亚洲天堂免费看| 成人免费视频网站在线观看| 日韩精品一区二区三区视频播放 | 欧美疯狂性受xxxxx喷水图片| 国产精品热久久久久夜色精品三区 | 在线观看免费成人| 国产精品成人一区二区艾草| 国产乱对白刺激视频不卡| 91精品国产品国语在线不卡| 亚洲国产婷婷综合在线精品| 91麻豆免费看片| 中文成人av在线| jlzzjlzz欧美大全| 中文字幕二三区不卡| 成人福利视频网站| 中文av一区二区| 99久久精品免费| 亚洲精品中文在线观看| 99久久婷婷国产综合精品电影|