【递归,链表,BST】将BST转换成双向链表

二叉搜索树与双向链表

http://www.nowcoder.com/questionTerminal/947f6eb80d944a84850b0538bf0ec3a5

图片说明

  • 既然是一棵树,可以考虑递归做法。

    • 如果左子树和右子树都已经处理好了,该怎么组合成一个新的链表?
    • 有点类似数学归纳法的思路
  • 以图片为例,左子树和右子树处理好之后,返回红色节点为head的双向链表,所以只需要将这两段链表和root合并即可

    • 合并之后返回的仍然是左子树的head(若有)
  • 边界情况

    • 若整个树为空,显然应该返回nullptr
    • 若左子树为空,则答案的head应该为root
    • 若右子树为空,则root->right 自然是nullptr,不需要特别处理

code:

TreeNode* Convert(TreeNode* pRootOfTree){
        //处理空树
        if(pRootOfTree == nullptr)
            return nullptr;
        TreeNode * ans = nullptr;
        //处理左子树(若有)
        if(pRootOfTree->left){
            ans = Convert(pRootOfTree->left);
            auto tail = ans;
            while(tail->right)
                tail = tail->right;
            tail->right = pRootOfTree; //处理左子树链表和root的衔接
            pRootOfTree->left = tail;
        }else ans = pRootOfTree; //若无左子树,head设置为root
        if(pRootOfTree->right){ //处理右子树
            auto nxtHalf = Convert(pRootOfTree->right);
            nxtHalf->left = pRootOfTree;
            pRootOfTree->right = nxtHalf;
        }
        return ans;
    }
全部评论

相关推荐

2 收藏 评论
分享
牛客网
牛客企业服务