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

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

相关推荐
来一碗刘肉面1 小时前
栈的应用(表达式求值)
数据结构·算法
yuannl104 小时前
图的深度优先遍历DFS
数据结构
青山木7 小时前
Hot 100 --- 岛屿数量
java·数据结构·算法·leetcode·深度优先·广度优先
不会就选b7 小时前
算法日常・每日刷题--<归并排序>1
数据结构·算法
危桥带雨8 小时前
排序算法(快排、归并、计数、基数排序)
数据结构·算法·排序算法
zephyr058 小时前
数据结构-并查集
数据结构
稚南城才子,乌衣巷风流9 小时前
动态树(Dynamic Tree)数据结构详解
数据结构·算法
zander25810 小时前
114. 二叉树展开为链表
数据结构·链表·深度优先
小肝一下10 小时前
3. 单链表
c语言·数据结构·c++·算法·leetcode·链表·dijkstra
tachibana211 小时前
hot100 前 K 个高频元素(347)
java·数据结构·算法·leetcode