力扣 226 翻转二叉树
全部刷题与学习记录
原题目
题目地址:226. 翻转二叉树
翻转一棵二叉树。
示例:
输入:
4
/ \
2 7
/ \ / \
1 3 6 9
输出:
4
/ \
7 2
/ \ / \
9 6 3 1
注:这道题与 剑指 27 二叉树的镜像 是一样的,但是我们这次采用递归三步法来考虑问题
考查知识点
递归三步法
自己的第一遍解法
首先分析题目,其实每一个二叉树的问题都可以在基础的(一个父节点,两个子节点)
上拓展出来,题目给我们宏观上的要求,我们要做的就是在二叉树的微观上做文章。
宏观:翻转二叉树
微观:将父节点的两个子节点交换位置
从微观再扩展一下,其实就是遍历树中每一个父节点,将它的两个子节点交换一下位置就行了
使用递归三步法:
1、确定递归函数的返回值与参数: 在递归访问每一个节点的过程中,只需要交换子节点次序,其实不需要返回什么东西,返回值为void
2、确定递归终止条件: 每次遇到叶节点后就结束本层递归,退回到父节点,因为叶节点没有子节点需要交换位置
3、确定单层递归的逻辑: 交换左右子节点
来看代码,因为二叉树没法直接输出树形结构,只能以深度优先(前中后 序遍历)或者广度优先(层序遍历)来查看修改以后的二叉树符不符合题目要求,所以写了一个前序遍历的查看函数visit()
进行测试
struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode() : val(0), left(nullptr), right(nullptr) {
}
TreeNode(int x) : val(x), left(nullptr), right(nullptr) {
}
TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {
}
};
class Solution {
public:
TreeNode* invertTree(TreeNode* root) {
if (root == nullptr) return nullptr;
travesal(root);
return root;
}
void travesal(TreeNode* node) {
//返回值及参数
if (node == nullptr) return;//退出条件
//单层逻辑
TreeNode* tmp;
tmp = node->left;
node->left = node->right;
node->right = tmp;
travesal(node->left);
travesal(node->right);
}
};
void visit(TreeNode* node) {
if (node != nullptr){
cout << node->val << " " ;
visit(node->left);
visit(node->right);
}
else return;
}
int main() {
TreeNode x4(4), x2(2), x7(7), x1(1), x3(3), x6(6), x9(9);
x4.left = &x2;
x4.right = &x7;
x2.left = &x1;
x2.right = &x3;
x7.left = &x6;
x7.right = &x9;
Solution so;
TreeNode* res = so.invertTree(&x4);
visit(res);
}