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

来源:互联网 发布:apache启动不了的原因 编辑:程序博客网 时间:2024/06/14 01:33

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

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,仅供参考学习。

1 0
原创粉丝点击