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

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

?? gentree.h

?? 數據結構的實現
?? 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一区二区三区免费野_久草精品视频
亚洲va天堂va国产va久| 亚洲国产精品欧美一二99| 51精品秘密在线观看| 91亚洲精品久久久蜜桃| av一区二区三区四区| 国产成人在线视频网站| 国产呦萝稀缺另类资源| 国产一区二区精品久久| 国产成人鲁色资源国产91色综| 久久精品久久99精品久久| 麻豆久久一区二区| 国产精品66部| 94-欧美-setu| 欧美自拍偷拍一区| 欧美乱妇20p| 日韩亚洲欧美在线| 久久久久久免费毛片精品| 日本一区二区视频在线观看| 国产视频视频一区| 亚洲欧洲国产专区| 亚洲图片欧美一区| 蜜桃免费网站一区二区三区| 韩国精品在线观看| av不卡在线观看| 欧美性极品少妇| 欧美成人一级视频| 国产欧美一二三区| 亚洲成av人片在线观看无码| 九九**精品视频免费播放| 成人av动漫在线| 欧美日韩国产另类一区| 欧美精品一区二区在线观看| 国产欧美日韩不卡| 亚洲第一会所有码转帖| 美日韩一区二区| av爱爱亚洲一区| 日韩免费观看高清完整版| 国产精品三级电影| 亚洲123区在线观看| 国产精品18久久久| 欧美视频完全免费看| 久久综合久色欧美综合狠狠| 亚洲天天做日日做天天谢日日欢 | 色婷婷av久久久久久久| 欧美酷刑日本凌虐凌虐| 欧美国产视频在线| 丝袜美腿亚洲综合| 色一区在线观看| 26uuu久久天堂性欧美| 亚洲电影在线免费观看| 高清视频一区二区| 欧美一区二区三区思思人| 亚洲欧洲三级电影| 国产一区91精品张津瑜| 欧美日韩精品免费| 亚洲欧洲国产日韩| 国产.欧美.日韩| 日韩欧美色电影| 性欧美大战久久久久久久久| 波多野洁衣一区| 精品国产免费人成在线观看| 亚洲sss视频在线视频| av日韩在线网站| 国产精品欧美一区二区三区| 国产一区不卡在线| 日韩欧美在线网站| 琪琪久久久久日韩精品| 欧美色视频一区| 亚洲欧美日韩国产综合| 99精品偷自拍| 国产精品久久久久aaaa| 成人av免费观看| 亚洲国产成人一区二区三区| 国产精品系列在线观看| 国产日韩欧美a| 国产在线播放一区三区四| 日韩欧美电影一区| 九九精品一区二区| 精品国产99国产精品| 久久99久久99小草精品免视看| 欧美一区二区三区小说| 日本sm残虐另类| 精品欧美乱码久久久久久| 寂寞少妇一区二区三区| 欧美精品一区二区精品网| 激情都市一区二区| 国产亚洲午夜高清国产拍精品 | 99re66热这里只有精品3直播| 国产精品午夜在线| 97久久人人超碰| 亚洲一线二线三线视频| 欧美美女黄视频| 久久se精品一区精品二区| 久久亚洲私人国产精品va媚药| 国产精品综合一区二区| 国产精品激情偷乱一区二区∴| 色婷婷亚洲一区二区三区| 亚洲最新在线观看| 91精品国产综合久久精品图片 | 91精品久久久久久久91蜜桃| 久久97超碰色| 国产精品麻豆视频| 欧美亚一区二区| 久久精品二区亚洲w码| 国产三级精品三级| 91色porny蝌蚪| 视频一区在线播放| 久久精品欧美一区二区三区不卡| av毛片久久久久**hd| 日韩av电影免费观看高清完整版在线观看| 日韩精品在线看片z| 91影院在线观看| 另类小说一区二区三区| 中文字幕永久在线不卡| 91精品国产欧美一区二区18| 国产福利一区二区三区在线视频| 亚洲一级电影视频| 国产日产精品1区| 欧美精品一二三| 成人免费va视频| 婷婷久久综合九色综合伊人色| 国产片一区二区三区| 在线播放视频一区| 99久久国产综合色|国产精品| 男女男精品视频| 亚洲欧美日韩在线播放| 国产亚洲婷婷免费| 日韩一级黄色片| 一本一道综合狠狠老| 国产高清在线精品| 日韩 欧美一区二区三区| 亚洲精品国产第一综合99久久 | 成人h精品动漫一区二区三区| 日本午夜精品一区二区三区电影| 亚洲欧美日韩中文播放| 中文字幕免费一区| 精品国产污网站| 91精品国产欧美一区二区18| 在线视频中文字幕一区二区| 成人精品视频一区| 国产麻豆视频一区二区| 蜜臀av一区二区在线观看| 亚洲一区二区中文在线| 亚洲欧美日韩精品久久久久| 日韩一区中文字幕| 国产精品看片你懂得| 国产日韩欧美精品综合| 久久精品日产第一区二区三区高清版| 日韩午夜在线观看视频| 91精品在线一区二区| 欧美丰满少妇xxxxx高潮对白 | 国产综合色视频| 久草这里只有精品视频| 免费看欧美女人艹b| 免费欧美在线视频| 麻豆91小视频| 久久国产精品色婷婷| 国产麻豆9l精品三级站| 国产在线视频不卡二| 黄一区二区三区| 韩国视频一区二区| 国产精品羞羞答答xxdd| 粉嫩蜜臀av国产精品网站| 高清免费成人av| 94色蜜桃网一区二区三区| 色婷婷久久综合| 欧美日韩国产高清一区二区三区 | 丁香桃色午夜亚洲一区二区三区| 国产成人免费视频网站 | 99久久精品国产一区| 91美女在线看| 欧美日韩久久不卡| 日韩精品在线一区| 久久精品一区二区| 亚洲同性gay激情无套| 亚瑟在线精品视频| 韩国女主播一区| 91视频你懂的| 欧美一区二区在线免费观看| 欧美v亚洲v综合ⅴ国产v| 中文字幕国产精品一区二区| 成人免费小视频| 丝袜诱惑亚洲看片| 久久99精品国产91久久来源| 成人app网站| 3atv一区二区三区| 国产欧美精品一区aⅴ影院| 一区二区三区免费看视频| 免费人成精品欧美精品| 成人毛片在线观看| 欧美巨大另类极品videosbest | 美脚の诱脚舐め脚责91| 国产成人高清在线| 欧美日韩一卡二卡| 国产网红主播福利一区二区| 婷婷开心激情综合| 99在线视频精品| 精品国产伦理网| 亚洲午夜久久久久| 成人一区二区视频|