剑指offer-面试题27:二叉搜索树与双向链

题目:输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点只能调整树中结点指针的指向。

思路:对于二叉搜索树,根结点的左子树都比它小,右子树都比它大,如果按照中序遍历那么结点就是排序的,问题的关键是如何修改指针指向。假设左右子树已经排序,那么只要将左子树的尾结点连接上根结点,根结点连接上右子树就可以了。关于怎么连接左右子树,还是有一点技巧的。我们每次连接完成之后都更新尾结点,因为每次连接都要用到尾结点,把它作为转换函数的一个参数传进去。左子树转换后的尾结点连接根结点,然后根结点作为新的尾结点去连接右子树。左右子树的转换等同于于根结点的转换,因此这是一个递归的过程。

BinaryTreeNode* Convert(BinaryTreeNode* pRoot)
{
    BinaryTreeNode* pLastNodeInList = NULL;
    ConvertNode(pRoot, &pLastNodeInList);
    
    BinaryTreeNode* pHeadOfList = pLastNodeInList;
    while(pHeadOfList != NULL && pHeadOfList->m_pLeft != NULL)
        pHeadOfList = pHeadOfList->m_pLeft;
        
    return pHeadOfList;
}

ConvertNode(BinaryTreeNode* pNode, BinaryTreeNode** pLastNodeInList)
{
    if(pNode == NULL)
        return;
        
    if(pNode->m_pLeft != NULL)
        ConvertNode(pNode->m_pLeft, pLastNodeInList);
        
    BinaryTreeNode* pCurrent = pNode;
    if(*pLastNodeInList != NULL)
        pLastNodeInList->m_pRight = pCurrent;
    pCurrent->m_pLeft = *pLastNodeInList;
    *pLastNodeInList = pCurrent;
    
    if(pNode->m_pRight != NULL)
        ConvertNode(pNode->m_pRight, pLastNodeInList);
}

你可能感兴趣的:(剑指offer-面试题27:二叉搜索树与双向链)