226.翻转二叉树
题目链接/文章讲解/视频讲解:代码随想录
节点交换也可以用swap
class Solution {
public:
TreeNode* invertTree(TreeNode* root) {
if (root == NULL) return root;
swap(root -> left, root -> right);
invertTree(root -> left);
invertTree(root -> right);
return root;
}
};
101. 对称二叉树
题目链接/文章讲解/视频讲解:代码随想录
为什么要用后序遍历?
我们要比较的是两课子树的内外侧节点,例如左子树的右节点和右子树的左节点是否下是否相等,左子树的右节点和右子树的左节点是否相等,将处理的信息返回给上层,所有遍历顺序只能是后序
要按内外侧处理
class Solution {
public:
bool isS(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 lef = isS(left -> left, right -> right);
// 内侧
bool rig = isS(left -> right, right -> left);
// 同时成立
bool isSym = lef && rig;
return isSym;
}
bool isSymmetric(TreeNode* root) {
if(root == NULL) return false;
return isS(root -> left, root -> right);
}
};
104.二叉树的最大深度
题目链接/文章讲解/视频讲解: 代码随想录
层序遍历最大深度即层数
int maxDepth(TreeNode* root) {
int res = 0;
if (root == NULL) return res;
queue<TreeNode*> q;
q.push(root);
while (!q.empty()) {
int _size = q.size();
TreeNode* node;
for (int i = 0; i < _size; i++) {
node = q.front();
q.pop();
if (node -> left) q.push(node -> left);
if (node -> right) q.push(node -> right);
}
res++; // 记录层数
}
return res;
}
递归法:
后序遍历求高度(即最大深度)
前序遍历求深度
后序是记录沿着条某一条路径递归到底走过的节点数量,取左右路径中的最大值
int pretravel(TreeNode* cur) {
if (cur == NULL) return 0;
int num1 = pretravel(cur -> left);
int num2 = pretravel(cur -> right);
int depth = 1 + max(num1, num2);
return depth;
}
int maxDepth(TreeNode* root) {
return pretravel(root);
}
前序则是每次递归都要更新深度
111.二叉树的最小深度
题目链接/文章讲解/视频讲解:代码随想录
层序遍历
int minDepth(TreeNode* root) {
queue<TreeNode*> q;
if (root != NULL) q.push(root);
int depth = 0;
while (!q.empty()) {
int _size = q.size();
depth++;
for(int i = 0; i < _size; i++) {
TreeNode* node = q.front();
q.pop();
if (node -> left == NULL && node -> right == NULL) { // 没有左右孩子说明出现叶子节点返回深度
return depth;
}else {
if (node -> left) q.push(node -> left);
if (node -> right) q.push(node -> right);
}
}
}
return depth;
}