#include "BSTree.h"
//将二叉树按中序遍历转换成双向链表(只调整指针的指向)
template<class T>
BSTreeNode<T>* BSTree2DoubleList(BSTreeNode<T>* pRoot){
BSTreeNode<T>* pNode = pRoot;
BSTreeNode<T>* pHeadNode = NULL;
BSTreeNode<T>* pPrevNode = NULL;
stack<BSTreeNode<T>*> _stack;
while (pNode || !_stack.empty()){
while (pNode){
_stack.push(pNode);
pNode = pNode->m_pLeft;
}
pNode = _stack.top();
_stack.pop();
//将访问到的当前结点变成双链表
if (pPrevNode == NULL){
pHeadNode = pNode;
}
else{
pPrevNode->m_pRight = pNode;
pNode->m_pLeft = pPrevNode;
}
pPrevNode = pNode;
pNode = pNode->m_pRight;
}
return pHeadNode;//返回双链表的第一个节点
}
//遍历双向链表
template<class T>
void TraversalList(BSTreeNode<T>* pNode){
while (pNode){
cout << pNode->m_Data << " ";
pNode = pNode->m_pRight;
}
}
测试代码:
int _tmain(int argc, _TCHAR* argv[])
{
BSTreeNode<int>* pRoot = new BSTreeNode<int>(10);
pRoot->m_pLeft = new BSTreeNode<int>(6, new BSTreeNode<int>(4), new BSTreeNode<int>(8));
pRoot->m_pRight = new BSTreeNode<int>(14, new BSTreeNode<int>(12), new BSTreeNode<int>(16));
TraversalList(BSTree2DoubleList(pRoot));
cout << endl;
return 0;
}
4 6 8 10 12 14 16