代码随想录算法训练营
Day1 代码随想录算法训练营第14天 |LeetCode226.翻转二叉树 LeetCode101. 对称二叉树 LeetCode104.二叉树的最大深度 LeetCode111.二叉树的最小深度
目录
前言
LeetCode226.翻转二叉树
LeetCode101. 对称二叉树
LeetCode104.二叉树的最大深度
LeetCode111.二叉树的最小深度
一、LeetCode226.翻转二叉树
1.题目链接
2.思路
反转二叉树本质上是将每个节点的左右子节点互换
需要先遍历并互换左右子节点
遍历方法不限
3.题解
(1)递归遍历
class Solution {
public:
TreeNode* invertTree(TreeNode* root) {
if(root==NULL)return root;
TreeNode *p=root->right;
root->right=root->left;
root->left=p;
invertTree(root->left);
invertTree(root->right);
return root;
}
};
(2)栈遍历(前序)
class Solution {
public:
TreeNode* invertTree(TreeNode* root) {
if (root == NULL)
return root;
stack<TreeNode*> st;
st.push(root);
while (!st.empty()) {
TreeNode* p = st.top();
st.pop();
TreeNode* n = p->left;
p->left = p->right;
p->right = n;
if (p->left != NULL)
st.push(p->left);
if (p->right != NULL)
st.push(p->right);
}
return root;
}
};
二、LeetCode101. 对称二叉树
1.题目链接
2.思路
(1)对称性:左右子树是否对称,等价于两个子树内层是否对应相等,外层是否对应相等
(2)递归思路
1)确定参数和返回值
2)终止条件:
左右节点均空:true
左右节点一个空一个不空:false
左右节点值不相等:false
左右节点值相等:递归
3)递归:
内层是否对称:inner=compare(左节点右子节点,右节点左子结点)
外层是否对称:outer=compare(左节点左子节点,右节点右子结点)
3.题解
class Solution {
public:
bool compare(TreeNode* l, TreeNode* r) {
if (l == NULL && r != NULL)
return false;
else if (l != NULL && r == NULL)
return false;
else if (l == NULL && r == NULL)
return true;
else if (l->val != r->val)
return false;
else {
bool inner = compare(l->right, r->left);
bool outer = compare(l->left, r->right);
return inner && outer;
}
}
bool isSymmetric(TreeNode* root) {
return compare(root->left, root->right);
}
};
三、LeetCode104.二叉树的最大深度
1.题目链接
2.思路
(1)基础概念
1)叶子结点:没有子节点的节点
2)深度:根节点到某个节点之间最大的边数或者结点数
高度:某节点到叶子结点之间最大的边数或者节点数
(2)分别对左子树和右子树进行递归,求出左子树中root的最大高度,右子树中root的最大高度最后,结果是二者的最大值
3.题解
class Solution {
public:
int maxDepth(TreeNode* root) {
if(root==NULL)return 0;
int l=maxDepth(root->left)+1;
int r=maxDepth(root->right)+1;
return max(l,r);
}
};
四、 LeetCode111.二叉树的最小深度
1.题目链接
2.思路
(1)这道题一个错解是将LeetCode104.二叉树的最大深度的max直接改成min
图示错误
(2)从上图我们看到,在去最小深度时,要排除root->left和root->right中只有一个为空的情况,因为此时root不是叶子结点,但是左侧深度会算成1
(3)因此,要对左子节点或子节点为空的情况进行讨论
1)如果左子树为空,右子树不为空,说明最小深度是右子树的深度+1。
2)右子树为空,左子树不为空,最小深度是 1 + 左子树的深度。 最后如果左右子树都不为空,返回(左右子树深度+1)最小值
3.题解
class Solution {
public:
int minDepth(TreeNode* root) {
if (root == NULL)
return 0;
int l = minDepth(root->left) + 1;
int r = minDepth(root->right) + 1;
if (root->left == NULL && root->right != NULL)
return r;
else if (root->right == NULL && root->left != NULL)
return l;
else
return min(l, r);
}
};
总结
今天的内容应用了好多二叉树遍历的做法,个人对递归更熟悉,主要用递归实现,其实栈和层序遍历也可实现。