微軟數據結構100題

題目來源於July的blog ttp://blog.csdn.net/v_JULY_v/article/details/6057286

我覺得題目挺有意思的,所以自己慢慢做.通過自己編寫來提高自己的能力.

1.把二元查找樹轉變成排序的雙向鏈表(樹)
題目:
輸入一棵二元查找樹,將該二元查找樹轉換成一個排序的雙向鏈表。
要求不能創建任何新的結點,只調整指針的指向。
   10
  / /
  6  14
/ / / /
4  8 12 16
轉換成雙向鏈表
4=6=8=10=12=14=16。

首先我們定義的二元查找樹 節點的數據結構如下:
struct BSTreeNode
{
  int m_nValue; // value of node
  BSTreeNode *m_pLeft; // left child of node
  BSTreeNode *m_pRight; // right child of node
};

思想:用非遞歸中序遍歷這顆查找樹即可得到雙向鏈表

template<class typeName>
void Tree<typeName>::ConvertToDoubleLink()
{
	stack<node<typeName> *> pNodeStack;
	node<typeName> *pPreNode=NULL;
	node<typeName> *pNode=&root;
	node<typeName> *firstNode=NULL;
	while(pNode || !pNodeStack.empty())
	{
		if(pNode)
		{
			pNodeStack.push(pNode);
			pNode=pNode->leftChild;
		}else
		{
			pNode=pNodeStack.top();
			pNodeStack.pop();
			pNode->leftChild=pPreNode;
			if(pPreNode)
				pPreNode->rightChild=pNode;
			else
				firstNode=pNode;
			pPreNode=pNode;
			pNode=pNode->rightChild;
		}
	}
	pNode=firstNode;
	pPreNode=NULL;
	while(pNode)
	{
		cout<<pNode->key<<"->";
		pPreNode=pNode;
		pNode=pNode->rightChild;
	}
	cout<<endl;
	while(pPreNode)
	{
		cout<<pPreNode->key<<"->";
		pPreNode=pPreNode->leftChild;
	}
}


 

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