代码随想录算法训练营day15|226.翻转二叉树、101.对称二叉树

层序遍历
看完本篇可以一口气刷十道题,试一试, 层序遍历并不难,大家可以很快刷了十道题。

题目链接/文章讲解/视频讲解:代码随想录

226.翻转二叉树 (优先掌握递归)

这道题目 一些做过的同学 理解的也不够深入,建议大家先看我的视频讲解,无论做过没做过,都会有很大收获。

题目链接/文章讲解/视频讲解:代码随想录

101. 对称二叉树 (优先掌握递归)

先看视频讲解,会更容易一些。

题目链接/文章讲解/视频讲解:代码随想录

cpp 复制代码
TreeNode* invertTree(TreeNode* root) {
	if (root == NULL) return root;
	swap(root->left, root->right);
	invertTree(root->left);
	invertTree(root->right);
	return root;
}

前序遍历节点并交换左右孩子

前序遍历和后序遍历都可以进行翻转二叉树,因为可以保证左右子树的原始顺序。如果是中序遍历的话,左->中(交换了左右子树)->右处理右子树时实际上是处理左子树,违背了我们的初衷

所以中序遍历不可以翻转二叉树

但是你说非要用"中序遍历"来写,也不是不可以

cpp 复制代码
 TreeNode* invertTree(TreeNode* root) {
        if (root == NULL) return root;
        invertTree(root->left); // 左
        swap(root->left, root->right);// 中
        invertTree(root->left); // 注意 这里依然要遍历左孩子,因为中间节点已经翻转了
        return root;
    }
cpp 复制代码
bool compare(TreeNode* left, TreeNode* right) {
	if (left == NULL && right != NULL) return false;
	else if (left != NULL && right == NULL) return false;
	else if (left == NULL && right == NULL) return true;
	else if (left->val != right->val) return false;

	bool outside = compare(left->left, right->right);
	bool inside = compare(left->right, right->left);
	bool isSame = outside && inside;
	return isSame;
}
bool isSymmetric(TreeNode* root) {
	if (root == NULL) return true;
	return compare(root->left, root->right);
}

递归三部曲:

1.确定递归函数的参数和返回值

2.确定终止条件base condition

3.确定单层递归的逻辑

写递归不要关注子问题的过程,很容易晕,要想子问题的结果,写好边界条件和非边界条件,剩下的交给计算机。

相关推荐
wuqingshun3141595 小时前
蓝桥杯 5. 交换瓶子
数据结构·c++·算法·职场和发展·蓝桥杯
我想进大厂7 小时前
图论---朴素Prim(稠密图)
数据结构·c++·算法·图论
我想进大厂7 小时前
图论---Bellman-Ford算法
数据结构·c++·算法·图论
lkbhua莱克瓦247 小时前
用C语言实现——一个中缀表达式的计算器。支持用户输入和动画演示过程。
c语言·开发语言·数据结构·链表·学习方法·交友·计算器
转基因9 小时前
Codeforces Round 1020 (Div. 3)(题解ABCDEF)
数据结构·c++·算法
Forworder10 小时前
[数据结构]树和二叉树
java·数据结构·intellij-idea·idea
我想进大厂10 小时前
图论---Kruskal(稀疏图)
数据结构·c++·算法·图论
@Aurora.10 小时前
数据结构手撕--【二叉树】
数据结构·算法
悲伤小伞10 小时前
C++_数据结构_详解红黑树
数据结构
前端 贾公子10 小时前
力扣 83 . 删除排序链表中的重复元素:深入解析与实现
数据结构·算法