leetcode刷题 226, 101, 104, 111
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:
TreeNode* invertTree(TreeNode* root) {
if(root != nullptr){
invertTree(root->left);
invertTree(root->right);
TreeNode * p = root->right;
root->right = root->left;
root->left = p;
}
return root;
}
};
101. 对称二叉树
给定一个二叉树,检查它是否是镜像对称的。

并非检查每个左右子树是否对称,而是整体的左右子树是否对称。
compare函数中,在检查到上层节点满足对称,要递归地检查下层的节点是否对称。
/**
* 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 compare(TreeNode * left, TreeNode * right){
if(left == nullptr && right == nullptr)
return true;
else if(left == nullptr && right != nullptr)
return false;
else if(left != nullptr && right == nullptr)
return false;
else if(left->val != right->val)//最后一种情况对应的是两个非空节点,直接比较两个非空节点的值。
return false;
return compare(left->left, right->right) && compare(left->right, right->left);
}
bool isSymmetric(TreeNode* root) {
if(root == nullptr)
return true;
return compare(root->left, root->right);
}
};
104.二叉树的最大深度
给定一个二叉树,找出其最大深度。
二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。
说明: 叶子节点是指没有子节点的节点。
示例: 给定二叉树 [3,9,20,null,null,15,7],

返回它的最大深度 3 。
/**
* 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 getDepth(TreeNode * cur){
if(cur == nullptr)
return 0;
else
return max(getDepth(cur->left), getDepth(cur->right)) + 1;
}
int maxDepth(TreeNode* root) {
return getDepth(root);
}
};
111.二叉树的最小深度
给定一个二叉树,找出其最小深度。
最小深度是从根节点到最近叶子节点的最短路径上的节点数量。
说明: 叶子节点是指没有子节点的节点。
示例:
给定二叉树 [3,9,20,null,null,15,7],

返回它的最小深度 2.
/**
* 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 getDepth(TreeNode* cur){
if(cur == nullptr)
return 0;
int leftDepth = getDepth(cur->left);
int rightDepth = getDepth(cur->right);
if(cur->left != nullptr && cur->right == nullptr)
return leftDepth + 1;
if(cur->right != nullptr && cur->left == nullptr)
return rightDepth + 1;
return 1 + min(leftDepth, rightDepth);//左右子树都不为空时取小的深度+1
}
int minDepth(TreeNode* root) {
return getDepth(root);
}
};
求最小深度的时候要注意排除非叶子节点的情况(只有一个孩子的节点)
浙公网安备 33010602011771号