leetcode 二叉树展开为链表 中等

Posted Wh1t3zZ

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了leetcode 二叉树展开为链表 中等相关的知识,希望对你有一定的参考价值。

 

 

 

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

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

  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 二叉树展开为链表 中等的主要内容,如果未能解决你的问题,请参考以下文章

leetcode中等114二叉树展开为链表

leetcode 二叉树展开为链表 中等

LeetCode Java刷题笔记— 114. 二叉树展开为链表

LeetCode Java刷题笔记— 114. 二叉树展开为链表

二叉树--二叉树展开为链表

LeetCode114 二叉树展开为链表 ---二叉树题 三种解法 (递归) (迭代) (前驱节点)