題目來源於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;
}
}