數據結構--二叉樹的線索化

線索二叉樹它解決了無法直接找到該結點在某種遍歷序列中的前趨和後繼結點的問題,出現了二叉鏈表找左、右孩子困難的問題,線索二叉樹又分爲前序線索化,中序線索化和後序線索化,分別用不同的邏輯去實現。

線索二叉樹的實現思想:借用一個枚舉類型tag其中包含兩個狀態Link(代表有數據),thread(代表下一個節點爲空)在一個節點的左節點或者右節點爲空的情況下,將它的left或right設爲thread,則它的左或右訪問的是改遍歷模式下訪問到的下一個節點數據,這樣就完成了跳到另一顆子樹的過程,減少了遞歸的次數。

650) this.width=650;" src="http://s1.51cto.com/wyfs02/M01/7E/C3/wKioL1cHyzrhQ7EMAAAxr7o_d78409.png" title="無標題.png2.png" width="500" height="301" border="0" hspace="0" vspace="0" style="width:500px;height:301px;" alt="wKioL1cHyzrhQ7EMAAAxr7o_d78409.png" />先序線索化

void _PrevorderThreading(BinaryTreeXsh<T> *cur, BinaryTreeXsh<T> *&prev)
	{
		if (cur == NULL)
		{
			return;
		}
		if (cur->_leftnode==NULL)
		{
			cur->_LeftTag=THREAD;
			cur->_leftnode=prev;
		}
		if (prev&&prev->_rightnode==NULL)
		{
			prev->_RightTag = THREAD;
			prev->_rightnode = cur;
		}
		prev = cur;
		if (cur->_LeftTag == LINK)
		{
			_PrevorderThreading(cur->_leftnode, prev);
		}
		if (cur->_RightTag == LINK)
		{
			_PrevorderThreading(cur->_rightnode, prev);
		}
	}

650) this.width=650;" src="http://s4.51cto.com/wyfs02/M01/7E/C7/wKiom1cHzD-htFEsAAA-4eQ-3Fg875.png" title="無標題.png" width="500" height="303" border="0" hspace="0" vspace="0" style="width:500px;height:303px;" alt="wKiom1cHzD-htFEsAAA-4eQ-3Fg875.png" />中序線索化

	void _InorderThreading(BinaryTreeXsh<T>* root, BinaryTreeXsh<T> *&prev)
	{
		BinaryTreeXsh<T>*cur = root;
		if (cur == NULL)
		{
			return;
		}
		_InorderThreading(cur->_leftnode, prev);
		
		if (cur->_leftnode == NULL)
		{
			cur->_LeftTag = THREAD;
			cur->_leftnode = prev;
		}
		if (prev&&prev->_rightnode == NULL)
		{
			prev->_RightTag = THREAD;
			prev->_rightnode = cur;
		}
		prev = cur;
		_InorderThreading(cur->_rightnode, prev);
	}

650) this.width=650;" src="http://s5.51cto.com/wyfs02/M00/7E/C7/wKiom1cHzYyytt8WAAA3QyIdfUU446.png" title="無標題.png" width="500" height="340" border="0" hspace="0" vspace="0" style="width:500px;height:340px;" alt="wKiom1cHzYyytt8WAAA3QyIdfUU446.png" />後序線索化

	void _PostorderThreading(BinaryTreeXsh<T>*root, BinaryTreeXsh<T>*&prev)
	{
		BinaryTreeXsh<T>*cur = root;
		if (cur == NULL)
		{
			return;
		}
		_PostorderThreading(cur->_leftnode, prev);
		_PostorderThreading(cur->_rightnode, prev);
		if (cur->_leftnode==NULL)
		{
			cur->_LeftTag = THREAD;
			cur->_leftnode = prev;
		}
		if (prev&&prev->_rightnode == NULL)
		{
			prev->_RightTag = THREAD;
			prev->_rightnode = cur;
		}
		prev = cur;
	}




本文出自 “痕跡” 博客,請務必保留此出處http://wpfbcr.blog.51cto.com/10696766/1761955

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章