在 C++ 中反转二叉树

Posted

技术标签:

【中文标题】在 C++ 中反转二叉树【英文标题】:Invert Binary Tree in 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;        
    
;

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

【问题讨论】:

【参考方案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,现在我意识到我的代码只有在我的树是对称的情况下才能工作。您发布的代码,我理解它的每一点。我们从底部递归地交换左右,这就是它的工作原理。感谢先生的帮助。

以上是关于在 C++ 中反转二叉树的主要内容,如果未能解决你的问题,请参考以下文章

在 C++ 中反转二叉树

C++二叉树进阶

二叉树算法-初阶

C++二叉树进阶(二叉搜索树,KV模型)

C++二叉树进阶(二叉搜索树,KV模型)

算法漫游指北(第十三篇):二叉树的基本概念满二叉树完全二叉树二叉树性质二叉搜索树二叉树定义二叉树的广度优先遍历