【面试题】二叉搜索树与双向链表

输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建新的结点,只能调整树中结点指针的指向。
这里写图片描述
在搜索二叉树中,左子结点的值总是小于父结点的值,右子结点的值总大于父结点的值,因此我们在转换成排序双向链表时,原先指向左子结点的指针调整为链表中前一个结点的指针,原先指向右子结点的指针调整为链表中指向后一个结点指针。
我们可以中序遍历树中每一个结点。当遍历到根节点时,应将它与其左子树中最大结点和其右子树中最小的结点相连。而此时,根节点的左子树已经是一个排序的链表了,并且链表最后一个结点是左子树中最大的,将其与根节点相连。遍历右子树时,将它与右子树中最小的结点相连。

这里写图片描述

void ConvertNode(TreeNode *pNode, TreeNode **pLastNode)
{
    if (pNode == NULL)
        return;
    TreeNode *pCur = pNode;
    if (pCur->left != NULL)
    {
        ConvertNode(pCur->left, pLastNode);//遍历左子树
    }
     //处理根节点
    pCur->left = *pLastNode;
    if (*pLastNode != NULL)
        (*pLastNode)->right = pCur;
    *pLastNode = pCur;
     //遍历右子树
    if (pCur->right != NULL)
    {
        ConvertNode(pCur->right, pLastNode);
    }
}

TreeNode* Convert(TreeNode* pRootOfTree)
{
    TreeNode *pLastNode = NULL;//指向双向链表的尾结点
    ConvertNode(pRootOfTree, &pLastNode);//二叉排序树转换成排序双向链表

    //取得双向链表的头指针
    TreeNode *pHead = pLastNode;
    while (pHead != NULL&&pHead->left != NULL)
    {
        pHead = pHead->left;
    }
    return pHead;
}

猜你喜欢

转载自blog.csdn.net/mmwwxx123/article/details/81331893