题解 | #二叉搜索树与双向链表#

二叉搜索树与双向链表

https://www.nowcoder.com/practice/947f6eb80d944a84850b0538bf0ec3a5

/*
struct TreeNode {
    int val;
    struct TreeNode *left;
    struct TreeNode *right;
    TreeNode(int x) :
            val(x), left(NULL), right(NULL) {
    }
};*/
//left就是前驱,right就是后继
//自上向下考虑:left天生前驱,right天生后继,关键就是考虑每次的插入问题
//自下向上考虑:递归,分配root_parent和root。向上归并时:root是root_parent的left时关照root的右边部分;root是root_parent的right时关照root的左边部分。
#include <ios>
class Solution {
  public:
    //后序遍历处理结点
    void Core(TreeNode* root_parent, TreeNode* root) {
        if (root == nullptr)   return;

        //后序
        Core(root, root->left);
        Core(root, root->right);

        TreeNode* root_left = root;
        TreeNode* root_right = root;

        //root是root_parent的left时关照root的右边部分
        if (root == root_parent->left) {
            //root左边不操作,关键找到最右边的结点
            while (root_right->right != nullptr) {
                root_right = root_right->right;
            }
            root_right->right = root_parent;
            root_parent->left = root_right;
            return;
        }

        //root是root_parent的right时关照root的左边部分
        if (root == root_parent->right) {
            //root右边不操作,关键找到最左边的结点
            while (root_left->left != nullptr) {
                root_left = root_left->left;
            }
            root_left->left = root_parent;
            root_parent->right = root_left;
            return;

        }

    }
    TreeNode* Convert(TreeNode* pRootOfTree) {
        //空或者单结点,直接返回
        if (pRootOfTree == nullptr || pRootOfTree->left == nullptr &&
                pRootOfTree->right == nullptr)   return pRootOfTree;

        TreeNode* root_parent = pRootOfTree;

        //pRootOfTree左边
        Core(root_parent, root_parent->left);

        //pRootOfTree右边
        Core(root_parent, root_parent->right);

        //找到双向链表头节点
        TreeNode* pHead = root_parent;
        while (pHead->left != nullptr) {
            pHead = pHead->left;
        }
        return pHead;
    }
};

全部评论

相关推荐

在等offer的火锅...:我去履历这么好,都找不到工作吗?
点赞 评论 收藏
分享
07-23 12:04
门头沟学院 Java
现在是很缺人吗
码农索隆:缺分母,不缺分子,这样好作为炫耀的资本
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务