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

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

相关推荐
hn小菜鸡17 分钟前
LeetCode 1356.根据数字二进制下1的数目排序
数据结构·算法·leetcode
SuperCandyXu3 小时前
leetcode2368. 受限条件下可到达节点的数目-medium
数据结构·c++·算法·leetcode
lyh13444 小时前
【SpringBoot自动化部署方法】
数据结构
MSTcheng.5 小时前
【数据结构】顺序表和链表详解(下)
数据结构·链表
慢半拍iii5 小时前
数据结构——F/图
c语言·开发语言·数据结构·c++
iceslime6 小时前
旅行商问题(TSP)的 C++ 动态规划解法教学攻略
数据结构·c++·算法·算法设计与分析
witton8 小时前
美化显示LLDB调试的数据结构
数据结构·python·lldb·美化·debugger·mupdf·pretty printer
chao_7898 小时前
链表题解——环形链表 II【LeetCode】
数据结构·leetcode·链表
kaiaaaa9 小时前
算法训练第十一天
数据结构·算法
-qOVOp-10 小时前
408第一季 - 数据结构 - 图II
数据结构