【问题标题】:Invert Binary Tree in C++在 C++ 中反转二叉树
【发布时间】:2021-12-04 10:07:03
【问题描述】:

我正在解决 LeetCode 问题226. Invert Binary Tree:

给定二叉树的root,反转该树,并返回其根。

示例 1

Input: root = [4,2,7,1,3,6,9]
Output: [4,7,2,9,6,3,1]

我编写了以下 C++ 代码,但它给出了错误的答案。不知道是不是我的逻辑有问题。

代码

class Solution {
public:
    void dfs1(TreeNode* root,vector<int> &vec){
        if(root==NULL)
            return;
        dfs1(root->left,vec);
        vec.push_back(root->val);
        dfs1(root->right,vec);
    }

    void dfs2(TreeNode* root,vector<int> &vec,int &j) {
        if(root==NULL)
            return;
        dfs1(root->right,vec);
        root->val=vec[j];
        j--;
        dfs1(root->left,vec);
    }
    
    TreeNode* invertTree(TreeNode* root) {
        vector<int> p;
        dfs1(root,p);
        int size=p.size()-1;
        dfs2(root,p,size);
        return root;        
    }
};

我只是在进行中序遍历并将值推送到向量中。然后我又执行了一个中序遍历,但这次我是在另一种方式遍历,即从右到左。

【问题讨论】:

    标签: binary-tree depth-first-search dsa


    【解决方案1】:

    几个问题:

    • dfs2 中,你调用dfs1...这似乎不是你想要的。您应该调用dfs2,并将j 作为第三个参数传递。

    • 当您从vec 的末尾获取值并向后走时,您不应交换leftright,但仍应先处理left,然后再处理right

    • 但是现在主要的打击来了:这个算法从不反映树的形状,它只是替换树中的。所以这只有在输入树的形状是对称的情况下才有效。

    由于后一点,您确实需要使用不同的算法。

    我会建议一种算法,它可以按照您喜欢的任何顺序遍历节点,并为每个节点交换 leftright 值。

    我将在这里提供一个隐藏的解决方案(剧透),以防您无法使其发挥作用:

    TreeNode* invertTree(TreeNode* root) {
    if (root == nullptr) return nullptr;
    invertTree(root-&gt;left);
    invertTree(root-&gt;right);
    TreeNode* temp = root-&gt;left;
    root-&gt;left = root-&gt;right;
    root-&gt;right = temp;
    return root;
    }

    【讨论】:

    • 好的,知道了。是的,它应该是 dfs2,现在我意识到我的代码只有在我的树是对称的情况下才能工作。您发布的代码,我理解它的每一点。我们从底部递归地交换左右,这就是它的工作原理。感谢先生的帮助。
    猜你喜欢
    • 2019-01-29
    • 2020-11-07
    • 1970-01-01
    • 2020-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-24
    • 2015-06-17
    相关资源
    最近更新 更多