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

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

?? gentree.h

?? 該程序是用vc開發的對動態數組進行管理的DLL
?? H
字號:
/* 一般樹(使用二叉樹方法實現的一般樹)
 * 函數傳回指針是為效率問題,得到指針只可用于訪問其數據成員,不可在外部調用 delete 釋放,要刪除樹節點請調用本類的 delete 函數
 */

#ifndef GENERAL_TREE_CLASS
#define GENERAL_TREE_CLASS

#include "treenode.h"
#include "dclinkedlist.h"	// 鏈表,用于遍歷

enum NextItemPos {TI_CURRENT, TI_ROOT, TI_CHILD, TI_NEXT, TI_PARENT /*TI_PREVIOUS*/};
enum InsertItemPos {TI_FIRST, TI_LAST};
enum IterMathod {TI_PREORDER, TI_POSTORDER, TI_LEVERORDER};	// 遍歷方法(前序、后序和層次)

template <class T>
class GenTree
{
private:
	// 指向樹根及當前節點的指針
	TreeNode<T> *root;
	TreeNode<T> *current;
	
	// 樹中數據項個數
	int size;

	// 上次選擇的遍歷方法
	enum IterMathod itermathod;
	// 用于遍歷的堆棧
	DCLinkedList < TreeNode<T>* > iterstack;
	// 用于遍歷的函數
	TreeNode<T> *GoFarLeft(TreeNode<T> *t); // 用于后序遍歷
	void GoAllChild(TreeNode<T> *t);		// 用于層次遍歷 	

	// 用于復制構造函數及賦值運算符
	TreeNode<T> *CopyTree(TreeNode<T> *t);
	
public:
	// 構造函數,析構函數
	GenTree(void);
	GenTree(const GenTree<T>& tree);
	~GenTree(void);
	
	// 賦值運算符
	GenTree<T>& operator= (const GenTree<T>& rhs);
	
// 返回匹配元素(得到指針后不可在外部 delete,否則會造成樹結構損壞)
//	TreeNode<T> *Find(const T& item);
	/*
		TI_FIRST	// 插入兄弟節點的頭部
		TI_LAST		// 插入兄弟節點的末尾
	*/
	TreeNode<T> *Insert(const T& item, TreeNode<T>* parent, enum InsertItemPos insertpos = TI_LAST);
	void Delete(TreeNode<T> *t);	// 如果刪除了 current 指向的節點,會導致 current = NULL
	void ClearTree(void);
	bool TreeEmpty(void) const;
	int TreeSize(void) const;		// 樹的總節點數

	// 遍歷樹的函數
	// 切記:遍歷過程中不可刪除樹節點(遍歷過程中只可訪問和修改樹節點的數據成員),否則結果無法預料
	void Reset(enum IterMathod itm = TI_POSTORDER);
	void Next(void);
	bool EndOfList(void) const;
	
	// 樹的特殊方法(得到指針后不可在外部 delete,否則會造成樹結構損壞)
	/*	
		TI_CURRENT	// 取得當前節點
		TI_ROOT		// 取得樹根節點
		TI_CHILD	// 取得當前節點的第一個子節點
		TI_NEXT		// 取得當前節點的下一個兄弟節點
		TI_PREVIOUS	// 取得當前節點的上一個兄弟節點(sorry, not implement) 
		TI_PARENT	// 取得當前節點的父節點	
	*/
	TreeNode<T> *GetNext(enum NextItemPos nextpos);
};

// 構造函數,初始化 root、current 為空,size 為 0,itermathod 為后序遍歷
template <class T>
GenTree<T>::GenTree(void):root(NULL), current(NULL), size(0), itermathod(TI_POSTORDER)
{}

// 復制構造函數
template <class T>
GenTree<T>::GenTree(const GenTree<T>& tree)
{
    // 將 tree 復制到當前對象,分配 current、size 和 itermathod
    root = CopyTree(tree.root);
    current = root;
    size = tree.size;
	itermathod = tree.itermathod;
}

// 析構函數
template <class T>
GenTree<T>::~GenTree(void)
{
    ClearTree();
}

// 刪除以 t 為根的子樹
template <class T>
void GenTree<T>::Delete(TreeNode<T> *t)
{
    if (t != NULL)
    {
        Delete(t->left);
        Delete(t->right);
		if (t == current)
			current = NULL;
        delete t;
		size--;
	}
}

// 復制樹 t 并使其存儲在當前對象中
template <class T>
TreeNode<T> *GenTree<T>::CopyTree(TreeNode<T> *t)
{
    TreeNode<T> *newlptr, *newrptr, *newNode;
   
    // 如果樹分支為空,返回 NULL
    if (t == NULL)
        return NULL;
        
    // 復制樹 t 的左子樹并將其根分配給 newlptr
    if (t->left != NULL) 
        newlptr = CopyTree(t->left);
    else
        newlptr = NULL;
 
    // 復制樹 t 的右子樹并將其根分配給 newrptr
    if (t->right != NULL) 
        newrptr = CopyTree(t->right);
    else
        newrptr = NULL;
 
    // 為當前根節點分配存儲器并將其數據值和指針分配給它的子樹,構造父指針,返回新指針
    newNode = new TreeNode<T>(t->data, newlptr, newrptr);
	if (newlptr != NULL)
	{
		newlptr->parent = newNode;
		TreeNode<T> *rptr = newlptr->right;
		while (rptr != NULL)
		{
			rptr->parent = newNode;
			rptr = rptr->right;
		}
	}

    return newNode;
}

// 賦值運算符
template <class T>
GenTree<T>& GenTree<T>::operator= (const GenTree<T>& rhs)
{
    // 不能將樹復制到自身
    if (this == &rhs)
        return *this;
        
    // 清除當前樹,將新樹復制到當前對象
    ClearTree();
    root = CopyTree(rhs.root);
    
    // 將 current 指針指向 root 并設置樹的 size 值及遍歷方法
    current = root;
    size = rhs.size;
	itermathod = rhs.itermathod;
    
    // 返回當前對象的指針
    return *this;
}

// 刪除樹中的所有節點
template <class T>
void GenTree<T>::ClearTree(void)
{
    Delete(root);
    root = current = NULL;
    size = 0;
}

// 指示樹是否為空
template <class T>
bool GenTree<T>::TreeEmpty(void) const
{
    return (size == 0);
}

// 返回樹中的數據項個數
template <class T>
int GenTree<T>::TreeSize(void) const
{
    return size;
}

// 返回從 t 開始的子樹左邊分支最左下方節點的地址,并將經過節點的地址壓入棧中
template <class T>
TreeNode<T> *GenTree<T>::GoFarLeft(TreeNode<T> *t)
{
   // 若 t 為 NULL,則返回 NULL
   if (t == NULL)
      return NULL;
      
   // 遍歷樹的最左邊,往棧中壓入每個節點的地址直到遇到左指針為 NULL 的節點
   // 返回指向該節點的指針
   while (t->left != NULL)
   {
      iterstack.InsertFront(t);
      t = t->left;
   }
   return t;
}

// 取得 t 的所有孩子并依次加入鏈表末尾
template <class T>
void GenTree<T>::GoAllChild(TreeNode<T> *t)
{
	if (t != NULL)
	{
		TreeNode<T> *rptr = t->left;
		while (rptr != NULL)
		{
			iterstack.InsertRear(rptr);
			rptr = rptr->right;
		}
	}
}

// 以選定的遍歷順序遍歷整個樹
template <class T>
void GenTree<T>::Reset(enum IterMathod itm)
{
	itermathod = itm;
	iterstack.ClearList();

	switch (itm)
	{
		case TI_PREORDER:
			current = root;
			break;
		case TI_POSTORDER:
			current = GoFarLeft(root);
			break;
		case TI_LEVERORDER:
			current = root;
			GoAllChild(root);
			break;
		default:
			throw "GenTree::Reset: Unknown iterator method";
	}
}

// 按指定遍歷順序將 current 設為下一節點
template <class T>
void GenTree<T>::Next(void)
{
	if (current == NULL)
		return;

	switch (itermathod)
	{
		case TI_POSTORDER:	// 前序遍歷
			if (current->right != NULL)
				current = GoFarLeft(current->right);
			else if (!iterstack.ListEmpty())
			{
				current = iterstack.Data();
				iterstack.DeleteFront();
			}
			else
				current = NULL;	// 遍歷結束
			break;
		case TI_PREORDER:	// 后序遍歷
			if (current->left != NULL)
			{
				iterstack.InsertFront(current);
				current = current->left;
			}
			else if (current->right != NULL)
				current = current->right;
			else if (!iterstack.ListEmpty())
			{
				current = iterstack.Data();
				iterstack.DeleteFront();
				current = current->right;
			}
			else
				current = NULL;
			break;
		case TI_LEVERORDER:	// 層次遍歷
			if (!iterstack.ListEmpty())
			{
				iterstack.Reset();
				current = iterstack.Data();
				iterstack.DeleteFront();
				GoAllChild(current);
			}
			else
				current = NULL;
			break;
		default:
			throw "GenTree::Next: Unknown iterator method";
	}
}

// 用來終止循環
template <class T>
bool GenTree<T>::EndOfList(void) const
{
	return (current == NULL);
}

template <class T>
TreeNode<T> *GenTree<T>::Insert(const T& item, TreeNode<T>* parent, enum InsertItemPos insertpos)
{
	TreeNode<T> *newNode = new TreeNode<T>(item);

	// 沒有 parent 的節點,只能是根節點
	if (parent == NULL)
	{
		ClearTree();
		root = current = newNode;
		size++;
		return newNode;
	}

	current = newNode;
	size++;
	switch (insertpos)
	{
		case TI_FIRST:
			newNode->right = parent->left;
			parent->left = newNode;
			break;
		case TI_LAST:
			{
				TreeNode<T> *rptr = parent->left;
				if (rptr == NULL)	// 這個節點還沒有孩子
				{
					parent->left = newNode;
					break;
				}
				while (rptr->right != NULL)
					rptr = rptr->right;
				rptr->right = newNode;
			}
			break;
		default:
			throw "GenTree::Insert: Unknown insert pos";
	}
	return newNode;
}

template <class T>
TreeNode<T> *GenTree<T>::GetNext(enum NextItemPos nextpos)
{
	if (nextpos == TI_ROOT)
		return root;
	else if (current == NULL)
		return NULL;
	
	switch (nextpos)
	{
		case TI_CURRENT:
			return current;
		case TI_CHILD:
			return current->left;
		case TI_NEXT:
			return current->right;
		case TI_PARENT:
			return current->parent;
		default:
			throw "GenTree::GetNext: Unknown next pos";
	}
}

#endif  // GENTREE_CLASS

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
老司机免费视频一区二区三区| 国产日韩欧美一区二区三区综合| 依依成人综合视频| 色天天综合色天天久久| 亚洲精品国产高清久久伦理二区| 在线观看成人免费视频| 日日摸夜夜添夜夜添精品视频| 91精品综合久久久久久| 九色|91porny| 亚洲欧洲色图综合| 精品视频999| 国产美女一区二区| 久久久久久久久久久久久久久99 | 国v精品久久久网| 欧美亚洲动漫制服丝袜| 日本在线不卡一区| xf在线a精品一区二区视频网站| 国产999精品久久| 亚洲精品ww久久久久久p站| 欧美精品色综合| 国产一二三精品| 亚洲男女毛片无遮挡| 制服丝袜成人动漫| 国产精品一区在线观看你懂的| 国产精品日韩精品欧美在线| 欧美在线三级电影| 久久99久久精品欧美| 国产精品成人免费精品自在线观看| 欧美视频日韩视频在线观看| 久久综合综合久久综合| 中文字幕一区二区三区在线观看| 欧美日韩在线播放三区四区| 国产美女精品人人做人人爽| 亚洲免费观看高清| 日韩一级二级三级精品视频| 99久久综合色| 久久国产人妖系列| 亚洲激情五月婷婷| 欧美成人aa大片| 色激情天天射综合网| 久久av资源站| 午夜精品久久久久影视| 中文一区在线播放| 精品国产乱码91久久久久久网站| 一本色道久久综合狠狠躁的推荐 | 亚洲人吸女人奶水| 久久青草欧美一区二区三区| 欧美午夜视频网站| 99精品欧美一区二区三区小说| 麻豆国产精品视频| 亚洲丰满少妇videoshd| 国产精品久久久久婷婷二区次| 欧美成人在线直播| 91国产免费看| 色偷偷一区二区三区| 国产成人精品免费在线| 美女视频黄免费的久久| 首页亚洲欧美制服丝腿| 亚洲免费电影在线| 亚洲人成影院在线观看| 国产精品久久久久影院| 亚洲国产精品精华液ab| 久久婷婷一区二区三区| 精品国产自在久精品国产| 91精品麻豆日日躁夜夜躁| 欧美优质美女网站| 在线亚洲一区二区| 91玉足脚交白嫩脚丫在线播放| 成人网在线免费视频| 国产一区二区精品久久| 国产一区在线视频| 国产一区二区三区电影在线观看| 久久国产成人午夜av影院| 久久黄色级2电影| 久久不见久久见中文字幕免费| 免费成人在线影院| 美女一区二区视频| 国内精品伊人久久久久影院对白| 蜜臀av性久久久久av蜜臀妖精 | 亚洲四区在线观看| 欧美国产日本韩| 国产亲近乱来精品视频 | 国产精品一二三四| 国产精品香蕉一区二区三区| 国内成+人亚洲+欧美+综合在线| 精品一区二区在线观看| 九九视频精品免费| 国产精品一区二区久久精品爱涩| 国产福利电影一区二区三区| 成人高清视频在线| 色综合久久88色综合天天6| 在线观看国产一区二区| 欧美一区二区三区电影| 精品成人在线观看| 国产精品二区一区二区aⅴ污介绍| 中文字幕中文字幕中文字幕亚洲无线| 中文字幕一区二区三中文字幕| 一区二区三区欧美日| 午夜精品久久久| 久久成人免费网站| jlzzjlzz国产精品久久| 欧美在线色视频| 日韩欧美成人一区二区| 国产女主播一区| 一级精品视频在线观看宜春院 | 亚洲va中文字幕| 国产成人精品免费视频网站| 亚洲成av人片观看| 亚洲国产精品久久久久秋霞影院| 爽好多水快深点欧美视频| 精品一区二区久久久| 成人国产精品免费观看动漫| 99re视频精品| 7777精品伊人久久久大香线蕉最新版 | 欧美偷拍一区二区| 日韩欧美精品三级| 亚洲欧洲美洲综合色网| 亚洲图片欧美色图| 久久99精品久久久久久动态图| 成人激情av网| 国产日产欧美一区| 亚洲综合丝袜美腿| 久久99精品国产.久久久久久| 国产精品一区二区久激情瑜伽| 一本一道久久a久久精品| 欧美一区二区视频在线观看| 国产日韩欧美亚洲| 午夜国产不卡在线观看视频| 国模套图日韩精品一区二区 | 欧美中文字幕亚洲一区二区va在线 | 日韩免费福利电影在线观看| 国产日韩欧美电影| 日韩精品成人一区二区三区| 成人h精品动漫一区二区三区| 777奇米成人网| 亚洲精品美腿丝袜| 国产不卡免费视频| 日韩一区二区在线观看视频| 亚洲品质自拍视频| 国产老肥熟一区二区三区| 欧美精品一卡两卡| 亚洲欧洲日韩综合一区二区| 韩国欧美国产一区| 日韩午夜在线观看| 香蕉乱码成人久久天堂爱免费| hitomi一区二区三区精品| 欧美电视剧在线观看完整版| 亚洲第一精品在线| 在线视频国产一区| 亚洲欧洲日韩综合一区二区| 国产一区福利在线| 日韩视频免费观看高清完整版在线观看| 中文字幕亚洲一区二区av在线| 精品一区二区在线播放| 日韩一区二区三区四区| 亚洲国产成人av网| 色婷婷激情综合| 最新欧美精品一区二区三区| 国产一区二区福利视频| 精品福利二区三区| 色吧成人激情小说| 国产精品一区免费在线观看| 欧美成人官网二区| 精品制服美女丁香| 欧美肥妇毛茸茸| 三级久久三级久久久| 欧美午夜精品电影| 亚洲第一在线综合网站| 欧美日韩国产综合草草| 亚洲成av人片观看| 欧美一三区三区四区免费在线看 | 国产精品污网站| 国产激情偷乱视频一区二区三区| 精品国产99国产精品| 久久 天天综合| 久久久久久一二三区| 国产一本一道久久香蕉| 欧美经典一区二区| 高清beeg欧美| 亚洲视频在线一区观看| 欧美曰成人黄网| 午夜激情综合网| 日韩三级高清在线| 激情小说亚洲一区| 精品久久人人做人人爱| 欧美高清性hdvideosex| 欧美大片国产精品| 性做久久久久久久免费看| 6080亚洲精品一区二区| 狠狠色综合日日| 中文字幕欧美一| 884aa四虎影成人精品一区| 国产做a爰片久久毛片| 中文字幕中文字幕在线一区| 91豆麻精品91久久久久久| 免费在线欧美视频| 国产精品美女久久久久久2018 | 亚洲免费观看在线观看| 欧美日韩在线一区二区| 极品少妇一区二区|