- 题目:输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表,要求不能创建任何新的结点,只能调整树中节点的指向,树的结点定义如下:
struct BinaryTreeNode
{
BinaryTreeNode(char data)
:_pLeft(NULL)
, _pRight(NULL)
, _data(data)
{}
BinaryTreeNode *_pLeft;
BinaryTreeNode *_pRight;
char _data;
};
例图:
思路:由于二叉搜索树是排序的数据结构,左子节点的值总是小于父节点的值,右子节点的值总是大于父节点的值,,因此我们可以中序遍历树中的每一个节点,遍历到根时根据排序链表的定义,将跟的左指针域与左子节点中最大的链接起来,右指针域与右子节点的最小的链接起来。
实现代码:
BinaryTreeNode *TreetoList(BinaryTreeNode *pRoot, BinaryTreeNode *&pPre)
{
if (NULL == pRoot)
return NULL;
TreetoList(pRoot->_pLeft,pPre);
if (pRoot)
pRoot->_pLeft = pPre;
if (pPre)
pPre->_pRight = pRoot;
pPre = pRoot;
TreetoList(pRoot->_pRight,pPre);
return pRoot;
}