二叉搜索树与双向链表

二叉搜索树与双向链表

题目描述

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

解题思路

  • 根据二叉搜索树的性质,排序链表就是它的中序遍历序列
  • 每一个父节点,以它的左子树的最大节点为双向链表的前一个节点,以它的右子树的最小节点为双向链表的后一个节点
  • 按照中序遍历的顺序,假设遍历到根节点,那么此时它的左子树已经是一个排序的双向链表了,并且双向链表的最后一个节点,用一个指针标记已经转换好的链表的最后一个节点,它就应该是根节点的前驱,把根节点链接上去以后,再更新
  • 转换完成后,因为二叉搜索树的根节点并不是转换后的链表的头节点,所以通过左指针,遍历回到双向链表的头节点
class Solution {
public:
    TreeNode* Convert(TreeNode* pRootOfTree)
    {
        if(pRootOfTree==NULL) return NULL;
        TreeNode *pLast=NULL;//指向已经转换好的链表的最后一个节点
        //转换的函数
        ConvertNode(pRootOfTree,pLast);
        //回到头节点
        TreeNode *phead=pRootOfTree;
        while(phead->left)
            phead=phead->left;
        return phead;
    }
    void ConvertNode(TreeNode* pNode,TreeNode *& pLast){
        if(pNode==NULL) return ;
        //左-根-右,中序遍历的套路
        ConvertNode(pNode->left,pLast);
        pNode->left=pLast;//当前节点的做指针指向已经转换好的链表的最后一个节点
        if(pLast!=NULL)
            pLast->right=pNode;//也让已转换好的链表的最后一个节点的右指针指向自己,构成双向链表
        pLast=pNode;//更新pLast节点
        ConvertNode(pNode->right,pLast);
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值