代码随想录算法训练营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.确定单层递归的逻辑

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

相关推荐
li星野14 小时前
刷题:数组
数据结构·算法
故事和你9118 小时前
洛谷-数据结构-1-3-集合3
数据结构·c++·算法·leetcode·贪心算法·动态规划·图论
自我意识的多元宇宙18 小时前
二叉树的遍历和线索二叉树--线索二叉树
数据结构
菜鸟丁小真19 小时前
LeetCode hot100-287.寻找重复数和994.腐烂的橘子
数据结构·算法·leetcode·知识点总结
笨鸟先飞的橘猫19 小时前
数据结构学习——跳表
数据结构·python·学习
Pentane.20 小时前
【力扣hot100】【Leetcode 15】三数之和|暴力枚举 双指针 算法笔记及打卡(14/100)
数据结构·笔记·算法·leetcode
Mr_pyx20 小时前
【LeetCode Hot 100】 - 缺失的第一个正数完全题解
数据结构·算法
xieliyu.20 小时前
Java顺序表实现扑克牌Fisher-Yates 洗牌算法
java·数据结构·算法·javase
guygg8820 小时前
极化码(Polar Codes)的MATLAB实现
开发语言·数据结构·matlab