91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

二叉樹的線索化算法思想詳解

發布時間:2020-07-23 13:49:09 來源:網絡 閱讀:866 作者:pawnsir 欄目:編程語言

    二叉樹的線索化,這幾天以來我很難掌握,今天終于想通了,哈哈,首先我們來看看二叉樹線索化之后會變成什么樣子,這里我們以圖中的二叉樹為例,圖如下:

二叉樹的線索化算法思想詳解

    畫的太糙,各位看官講究著看吧- -。所謂二叉樹的線索化,就是當一個節點的左右指針為空時,就讓它的左右指針指向該節點的前驅或者后繼(一般來說左指針指向前驅,右指針指向后繼)。這里不論指向前驅或者后繼,我們都應該線索化時,至少要明確兩個節點指針的值,當前節點和當前節點的前驅/后繼。這也是線索化的兩種思路:

    保存前驅:訪問當前節點時若當前節點的左指針為空,則令左指針指向前驅,若前驅的右指針為空,則令前驅的右指針指向當前節點,代碼描述如下:

void visit(NODE* cur,NODE* &prev)//當前指針的前驅在當前指針訪問時會改變,故傳引用用來改變//prev
{
       if(prev->right==NULL;
           prev->right=cur;
       if(cur->left==NULL)
           cur->left=prev;
       prev=cur;
}

    這里我們要注意的是應該先進行訪問,最后再改變prev的值。

    保存后繼:這種方法很難做到,并且個人覺得沒有什么意義,因為在遍歷整個數的過程中我們始終都會訪問到一個節點的后繼,若將要訪問后繼那我們如何保存到未來的東西,即使通過類似棧的數據結構通過壓棧來強行訪問,效率也是不高的,在此不推薦。

    接下來獻上c++完整的線索二叉樹結構以及中序線索化過程,通過遞歸與非遞歸兩種方式實現,其他的都大同小異。

    節點類定義如下:

    

typedef char Datatype;
enum NodeType
{
	LINK,
	THERAD
};

struct TheardBinaryTreeNode
{
	TheardBinaryTreeNode* _left;
	TheardBinaryTreeNode* _right;
	NodeType _leftTag;
	NodeType _rightTag;
	Datatype _data;
	TheardBinaryTreeNode(const Datatype & data)
		:_left(NULL)
		, _right(NULL)
		, _leftTag(LINK)
		, _rightTag(LINK)
		,_data(data)
	{}
	TheardBinaryTreeNode()
		: _left(NULL)
		, _right(NULL)
		, _leftTag(LINK)
		, _rightTag(LINK)
		,_data((Datatype)0)
	{}
};

    中序線索化如下:

	void InTherad()
	{
		NODE* prev = NULL;
		_InTherad(_root, prev);
		//stack<NODE*>s;//借助棧來實現非遞歸的中序線索化
		//NODE* cur = _root;
		//NODE* prev = NULL;
		//while (!s.empty()||cur)
		//{
		//	while (cur)
		//	{
		//		s.push(cur);
		//		cur = cur->_left;
		//	}
		//	NODE* top = s.top();
		//	s.pop();
		//	if (top->_left == NULL&&top->_leftTag == LINK)
		//	{
		//		top->_left = prev;
		//		top->_leftTag = THERAD;
		//	}
		//	prev = top;
		//	if (top->_right == NULL&&top->_rightTag==LINK)
		//	{
		//		top->_rightTag = THERAD;
		//		if (!s.empty())
		//			top->_right = s.top();
		//	}
		//	else
		//		cur = top->_right;
		//}
	}
		void _InTherad(NODE*root, NODE* &prev)//遞歸的中序線索化
	{
		if (root == NULL)
			return;
		_InTherad(root->_left, prev);
		if (prev&&prev->_rightTag == LINK&&prev->_right == NULL)
		{
			prev->_right = root;
			prev->_rightTag = THERAD;
		}
		if (root->_leftTag == LINK&&root->_left == NULL)
		{
			root->_leftTag = THERAD;
			root->_left = prev;
			prev = root;
		}
		_InTherad(root->_right,prev);
	}

    如有不足或者疑問希望留言提出。3Q -3-。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

凌海市| 颍上县| 贵州省| 合阳县| 镇巴县| 桦南县| 长武县| 宜都市| 长汀县| 棋牌| 波密县| 丹寨县| 赤水市| 邢台县| 宜宾县| 广宁县| 闽侯县| 芒康县| 东城区| 承德县| 莲花县| 军事| 阿拉善左旗| 安泽县| 庐江县| 寻乌县| 崇州市| 雷波县| 阿勒泰市| 乌兰浩特市| 滁州市| 象山县| 财经| 巴青县| 洞口县| 治县。| 高青县| 宣化县| 华阴市| 望江县| 成都市|