您的位置:首页 > 理论基础 > 数据结构算法

0052 二叉搜索树线索化为双向链表

2016-07-28 17:55 429 查看
将一棵二叉搜索树(又叫查找树)转化成一个排序的双向链表,我们也叫它为线索化。

思路:

二叉树中,每个节点都有两个指向子节点的指针。在双向链表中,每个节点也有两个指针,一个指向前,一个指向后。因此这两种结构有相似之处。在二叉树查找中,左节点的值小于父节点的值,右节点的值大于父节点的值,因此考虑:原先指向左子节点的指针调整为链表指向前一个节点的指针,原先指向右子节点的指针调整为链表中指向后一个节点指针。

假设二叉树的定义为:

struct BinaryTreeNode{
int              m_nValue;
BinaryTreeNode*  m_pLeft;
BinaryTreeNode*  m_pLeft;
};


递归的方法线索化代码:

BinaryTreeNode* Convert(BinaryTreeNode* pRootOfTree)
{
//pLastNodeInList 指向双向链表的尾节点,我们要返回头结点

BinaryTreeNode* pLastNodeInList = NULL;
ConvertNode(pRootOfTree,&pLastNodeInList);//这个函数后面实现

BinaryTreeNode* pHeadOfList = pLastInList;
while(pHeadOfList != NULL && pHeadOfList->m_pLeft != NULL)
pHeadOfList = pHeadOfList->m_pLeft;

return pHeadOfList;

//这里定义ConvertNode()函数
void ConvertNode(BinaryTreeNode*     pNode,
BinaryTreeNode**    pLastNodeInList)
{
if(pNode ==NULL)
return ;
BinaryTreeNode* pCurrent = pNode;

if(pCurrent->m_pLeft != NULL)
ConvertNode(pCurrent->m_pLeft,pLastNodeInList);

pCurrent->m_pLeft = *pLastNodeInList;
if(*pLastNodeInList != NULL)
(*pLastNodeInList)->m_pLeft = pCurrent;

*pLastNodeInList = pCurrent;

if(pCurrent->m_pRight != NULL)
ConvertNode(pCurrent->m_pRight,pLastNodeInList);
}
}


本文来自《剑指offer》.面试题27,仅供参考学习。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息