1)二元查找树转换为双线链表
注意事项与学习内容:
1.建立树前应该构造结点结构。
2.创建树的时候,应用递归,并且参数采用引用类型。
3.原理:二元查找树的中续遍历能够顺序的输出当前树的所有数值,利用前续遍历进行对每个节点的转换。
- 使当前节点的左指针指向当前的双向链表
- 使当前节点的左指针的右指针指向当前节点
code:
#include <cstdio>
#include <iostream>
using namespace std;
typedef struct BSTreeNode
{
int m_nValue; // value of node
BSTreeNode *m_pLeft; // left child of node
BSTreeNode *m_pRight; // right child of node
}DoubleList;
DoubleList * pHead;
DoubleList * pListIndex; //双向链表最后一个元素
void convertToDoubleList(BSTreeNode * pCurrent);
// 创建二元查找树
void addBSTreeNode(BSTreeNode* &pCurrent, int value)
{
if (NULL == pCurrent)
{
BSTreeNode * pBSTree = new BSTreeNode();
pBSTree->m_pLeft = NULL;
pBSTree->m_pRight = NULL;
pBSTree->m_nValue = value;
pCurrent = pBSTree;
}
else
{
if ((pCurrent->m_nValue) > value)
{
addBSTreeNode(pCurrent->m_pLeft, value);
}
else if ((pCurrent->m_nValue) < value)
{
addBSTreeNode(pCurrent->m_pRight, value);
}
else
{
//cout<<"重复加入节点"<<endl;
}
}
}
// 遍历二元查找树 中序
void ergodicBSTree(BSTreeNode* pCurrent)
{
if (NULL == pCurrent)
{
return;
}
if (NULL != pCurrent->m_pLeft)
{
ergodicBSTree(pCurrent->m_pLeft);
}
// 节点接到链表尾部
convertToDoubleList(pCurrent);
// 右子树为空
if (NULL != pCurrent->m_pRight)
{
ergodicBSTree(pCurrent->m_pRight);
}
}
// 二叉树转换成list
//
void convertToDoubleList(BSTreeNode * pCurrent)
{
pCurrent->m_pLeft = pListIndex; // 当前指针的左指针指向当前双向链表的最后一个元素
if (NULL != pListIndex)
{
pListIndex->m_pRight = pCurrent; // 双向链表的最后一个元素指向当前元素
}
else
{
pHead = pCurrent; // 中续遍历第一个节点定义为双线链表的头HEAD
}
pListIndex = pCurrent; // 链表末尾指针移动到新加入的元素
cout<<pCurrent->m_nValue<<endl;
}
int main()
{
BSTreeNode * pRoot = NULL;
pListIndex = NULL;
pHead = NULL;
addBSTreeNode(pRoot, 10);
addBSTreeNode(pRoot, 4);
addBSTreeNode(pRoot, 6);
addBSTreeNode(pRoot, 8);
addBSTreeNode(pRoot, 12);
addBSTreeNode(pRoot, 14);
addBSTreeNode(pRoot, 15);
addBSTreeNode(pRoot, 16);
ergodicBSTree(pRoot);
return 0;
}
Reference:
1.http://blog.csdn.net/v_july_v/article/details/6870251