解题思路
如果从整棵树的角度来看,用层序遍历翻转一棵二叉树需要遍历同一层节点后再反向遍历该层节点并且改变指针,但是这样做不仅低效率还会访问到野指针。因此必须换一个角度考虑问题:如果将每一个父节点的左右孩子交换,同样能达到翻转二叉树的效果。
如果使用前序遍历,参考之前“前序遍历输出节点值”的代码和递归三要素:确定递归函数的参数和返回值,确定终止条件,确定单层递归的逻辑。
class Solution {
public:
TreeNode* invertTree(TreeNode* root)
{
if (root == nullptr)
return root;
swap(root->left, root->right);
invertTree(root->left);
invertTree(root->right);
return root;
}
};
同样也可以使用层序遍历,增加一句交换左右节点即可
class Solution {
public:
TreeNode* invertTree(TreeNode* root)
{
queue<TreeNode*> temp;
if(root != nullptr)
temp.push(root);
else
return root;
while(!temp.empty())
{
int num = temp.size();
for(int i = 0; i < num; i++)
{
TreeNode* top = temp.front();
temp.pop();
swap(top->left, top->right);
if(top->left != nullptr)
temp.push(top->left);
if(top->right != nullptr)
temp.push(top->right);
}
}
}
return root;
};