将一棵二叉搜索树(又叫查找树)转化成一个排序的双向链表,我们也叫它为线索化。
思路:
二叉树中,每个节点都有两个指向子节点的指针。在双向链表中,每个节点也有两个指针,一个指向前,一个指向后。因此这两种结构有相似之处。在二叉树查找中,左节点的值小于父节点的值,右节点的值大于父节点的值,因此考虑:原先指向左子节点的指针调整为链表指向前一个节点的指针,原先指向右子节点的指针调整为链表中指向后一个节点指针。
假设二叉树的定义为:
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,仅供参考学习。