c++实现---二叉搜索树与双向链表

题目:输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
二叉搜索树:左子树的值小于根节点的值,右子树的值大于根节点的值,利用二叉搜索树的特点,转换为排序的双向链表可以考虑二叉树的中序遍历。
中序遍历刚好满足左子节点、根节点、右子节点的顺序;
先把左右子树都转换成排序双向链表之后再和根节点连接起来,整棵二叉搜索树变成了排序双向链表

class Solution {
public:
    void convertNode(TreeNode *pNode,TreeNode **pLastNode){
        if(pNode==nullptr) return;
        TreeNode *pCur=pNode;//中序遍历,先得到根节点
        
        if(pCur->left){//递归的转换左子树
            convertNode(pCur->left, pLastNode);
        }
        
        pCur->left=*pLastNode;//当前节点的左指针指向last结点
        if(*pLastNode!=nullptr){//如果last结点不为空,则将last的右指针指向当前结点
            (*pLastNode)->right=pCur;
        }
        *pLastNode=pCur;//更新last结点
        
        if(pCur->right!=nullptr){//递归的转换右子树
            convertNode(pCur->right, pLastNode);
        }
    }
    TreeNode* Convert(TreeNode* pRootOfTree)
    {
        TreeNode *pLastNode=nullptr;
        convertNode(pRootOfTree,&pLastNode);//完成二叉搜索树到排序双向链表的转换,此时pLast是最后一个结点
        TreeNode *pHead=pLastNode;
        while(pHead!=nullptr&&pHead->left!=nullptr){//遍历找到排序双向链表的头节点并返回
            pHead=pHead->left;
        }
        return pHead;
    }
};

猜你喜欢

转载自blog.csdn.net/Fizz6018/article/details/107000990