226.翻转二叉树 (优先掌握递归)
题目链接/文章讲解/视频讲解:翻转二叉树
交换的是指针,而不是数值,如果用数值做交换,需要交换的节点下面无法很好的操作。
使用递归来实现,但要提前清除是什么顺序的递归(前中后)
具体操作是——每一个节点的左右孩子都翻转一下指针
/*** Definition for a binary tree node.* 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:void f(TreeNode* root){if(root==NULL) return;swap(root->left,root->right);if(root->left!=NULL) f(root->left);//不写返回if(root->right!=NULL) f(root->right);}TreeNode* invertTree(TreeNode* root) {//递归//参数与返回值(二叉树)、递归结束条件、每一层的执行逻辑f(root);return root;}
};
101. 对称二叉树 (优先掌握递归)
题目链接/文章讲解/视频讲解:对称二叉树
/*** Definition for a binary tree node.* 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:bool f(TreeNode* a,TreeNode* b){// 先检查空指针情况if (a == nullptr && b == nullptr) return true;if (a == nullptr || b == nullptr) return false;//这个本身包含两个都为空,所以要放下面// 再检查值是否相等(现在安全了)if (a->val != b->val) return false;return f(a->left,b->right)&&f(a->right,b->left);}bool isSymmetric(TreeNode* root) {//如果翻转之后的二叉树和之前一样,则说明对//但是也有其他情况。。所以不能一味去翻转//两个子树判断是否相等(使用同样的遍历顺序)if (root == nullptr) return true;return f(root->left,root->right);}
};
深度与高度
- 二叉树节点的深度:指从根节点到该节点的最长简单路径边的条数或者节点数(取决于深度从0开始还是从1开始)
- 二叉树节点的高度:指从该节点到叶子节点的最长简单路径边的条数或者节点数(取决于高度从0开始还是从1开始)
- 使用前序求的就是深度,使用后序求的是高度。
104.二叉树的最大深度 (优先掌握递归)
题目链接/文章讲解/视频讲解: 二叉树的最大深度
最大深度是要把节点尽可能的往下面放,也就是根节点(到叶子节点)的高度
递归遍历计算其深度
/*** Definition for a binary tree node.* 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:int f(TreeNode* node){//既然是算根节点到叶子节点的最长路径的结点数,也就是根节点的高度,则用后序遍历,返回最长的if(node==NULL) return 0;int ld = f(node->left);// 左int rd = f(node->right);// 右int depth = 1 + max(ld, rd); // 中return depth;}int maxDepth(TreeNode* root) {return f(root);}
};
111.二叉树的最小深度 (优先掌握递归)
和最大深度看似差不多,实则不然。
题目链接/文章讲解/视频讲解:二叉树的最小深度
/*** Definition for a binary tree node.* 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:int f(TreeNode*node){if(node==NULL) return 0;int lm=f(node->left);int rm=f(node->right);if(node->left==NULL&& node->right != NULL) return 1 + rm;//if(node->right==NULL&& node->left != NULL) return 1 + lm;//int md=1+min(lm,rm);return md;}int minDepth(TreeNode* root) {//后序遍历return f(root);}
};