首页 > 其他 > 详细

leetcode 二叉树展开为链表 中等

时间:2021-08-12 23:27:29      阅读:41      评论:0      收藏:0      [点我收藏+]

技术分享图片

 

 

 

此题的关键部分就是如何处理 右儿子如何连接在左儿子上,然后再由左儿子变成父亲的右儿子。

现假设为一种最简单的情况:

  O (a)

   /       \

O (b)    O (c)

显然,节点 c 需要的得到的点是节点 b

    O (a)

     /       \

  O (b)    O (c)

   \

    O (d)

节点 c 需要的点是节点 d.

所以,对于当前父亲节点,其左儿子中最右下的那个值,就是其右儿子的前驱。如果左儿子没有往右的值,最左下的值就是右儿子的前驱。

还是代码解释的清楚:

class Solution {
public:
    void flatten(TreeNode* root) {
        auto _ = solve(root);
    }

    TreeNode *solve(TreeNode *root) {
        if(root == nullptr) return root;
        auto retLef = solve(root -> left);
        auto retRig = solve(root -> right);
        if(retLef) {
            retLef -> right = root -> right;
            root -> right = root -> left;
            root -> left = nullptr;
        }
        return retRig ? retRig : (retLef ? retLef : root);      // 返回的值为兄弟节点的前驱
    }
};

 

再贴一个官方的:

class Solution {
public:
    void flatten(TreeNode* root) {
        TreeNode *curr = root;
        while (curr != nullptr) {
            if (curr->left != nullptr) {
                auto next = curr->left;
                auto predecessor = next;
                while (predecessor->right != nullptr) {
                    predecessor = predecessor->right;
                }
                predecessor->right = curr->right;
                curr->left = nullptr;
                curr->right = next;
            }
            curr = curr->right;
        }
    }
};

leetcode 二叉树展开为链表 中等

原文:https://www.cnblogs.com/rookie-acmer/p/15135249.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!