226.翻转二叉树
题目
翻转一棵二叉树。
解题思路
- 其实就是循环将根节点的左右子节点互换就行
- 可以用层序遍历,每遍历一层就互换其左右子节点,符合惯性思维
- 也可以用递归法,前序遍历和后序遍历
代码
层序遍历
class Solution {
public:
TreeNode* invertTree(TreeNode* root) {
queue<TreeNode*> que;
if (root != NULL) que.push(root);
while (!que.empty()) {
int size = que.size();
for (int i = 0; i < size; i++) {
TreeNode* node = que.front();
que.pop();
swap(node->left, node->right); // 节点处理
if (node->left) que.push(node->left);
if (node->right) que.push(node->right);
}
}
return root;
}
};
递归算法
-
确定递归函数的参数和返回值
本例子中,就是互换node节点的left和right,那么每次传入node即可TreeNode* invertTree(TreeNode* root)
-
确定终止条件
如果当前节点为空,则返回该节点if(root==nullptr) return root;
-
确定循环主体
循环互换其左子树和右子树上的左右子节点即可swap(root->left, root->right); invertTree(root->left); invertTree(root->right);
完整代码如下:
class Solution {
public:
TreeNode* invertTree(TreeNode* root) {
if (root == NULL) return root;
swap(root->left, root->right); // 中
invertTree(root->left); // 左
invertTree(root->right); // 右
return root;
}
};