在 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
的末尾获取值并向后走时,您不应交换left
和right
,但仍应先处理left
,然后再处理right
但是现在主要的打击来了:这个算法从不反映树的形状,它只是替换树中的值。所以这只有在输入树的形状是对称的情况下才有效。
由于后一点,您确实需要使用不同的算法。
我会建议一种算法,它可以按照您喜欢的任何顺序遍历节点,并为每个节点交换 left
和 right
值。
我将在这里提供一个隐藏的解决方案(剧透),以防您无法使其发挥作用:
TreeNode* invertTree(TreeNode* root)
if (root == nullptr) return nullptr;
invertTree(root->left);
invertTree(root->right);
TreeNode* temp = root->left;
root->left = root->right;
root->right = temp;
return root;
【讨论】:
好的,知道了。是的,它应该是 dfs2,现在我意识到我的代码只有在我的树是对称的情况下才能工作。您发布的代码,我理解它的每一点。我们从底部递归地交换左右,这就是它的工作原理。感谢先生的帮助。以上是关于在 C++ 中反转二叉树的主要内容,如果未能解决你的问题,请参考以下文章