目录
二叉树
1. 94. 二叉树的中序遍历
2. 98. 验证二叉搜索树
3. 101. 对称二叉树
二叉树
1. 94. 二叉树的中序遍历
给定一个二叉树的根节点 root
,返回 它的 中序 遍历 。
示例 1:
输入:root = [1,null,2,3] 输出:[1,3,2]
示例 2:
输入:root = [] 输出:[]
示例 3:
输入:root = [1] 输出:[1]
提示:
- 树中节点数目在范围
[0, 100]
内 -100 <= Node.val <= 100
// 二叉树的遍历
class Solution {
public:
vector<int> result; // 用来存储中序遍历的结果的向量
// 中序遍历的递归函数
void inorder(TreeNode* root){
if(!root) return; // 如果节点为空,直接返回
inorder(root->left); // 递归遍历左子树
result.push_back(root->val); // 将当前节点的值加入结果向量
inorder(root->right); // 递归遍历右子树
}
// 主函数,返回中序遍历的结果
vector<int> inorderTraversal(TreeNode* root) {
inorder(root); // 调用中序遍历的递归函数
return result; // 返回结果向量
}
};
解释:
- 从根节点开始,先访问左子树,然后访问根节点,最后访问右子树。
- 对于当前的二叉树:
- 根节点为
1
,先访问左子树,但是左子树为空,因此直接访问根节点1
,将1
加入结果数组。 - 然后访问右子树,右子树是节点
2
。 - 对于节点
2
,先访问左子树,即节点3
。访问节点3
,将3
加入结果数组。 - 然后访问根节点
2
,将2
加入结果数组。
- 根节点为
2. 98. 验证二叉搜索树
给你一个二叉树的根节点 root
,判断其是否是一个有效的二叉搜索树。
有效 二叉搜索树定义如下:
- 节点的左子树只包含 小于 当前节点的数。
- 节点的右子树只包含 大于 当前节点的数。
- 所有左子树和右子树自身必须也是二叉搜索树。
示例 1:
输入:root = [2,1,3] 输出:true
示例 2:
输入:root = [5,1,4,null,null,3,6] 输出:false 解释:根节点的值是 5 ,但是右子节点的值是 4 。
提示:
- 树中节点数目范围在
[1, 104]
内 -231 <= Node.val <= 231 - 1
/**
* 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 isBSTHelper(TreeNode* root, int minVal, int maxVal) {
// 如果节点为空,返回true
if (!root) return true;
// 检查当前节点值是否在允许的范围内
if (root->val <= minVal || root->val >= maxVal) {
return false;
}
// 递归检查左子树和右子树,更新范围
return isBSTHelper(root->left, minVal, root->val) &&
isBSTHelper(root->right, root->val, maxVal);
}
// 主函数,判断给定的二叉树是否是有效的二叉搜索树
bool isValidBST(TreeNode* root) {
// 初始时,最小值为INT_MIN,最大值为INT_MAX
return isBSTHelper(root, INT_MIN, INT_MAX);
}
};
3. 101. 对称二叉树
给你一个二叉树的根节点 root
, 检查它是否轴对称。
示例 1:
输入:root = [1,2,2,3,4,4,3] 输出:true
示例 2:
输入:root = [1,2,2,null,3,null,3] 输出:false
提示:
- 树中节点数目在范围
[1, 1000]
内 -100 <= Node.val <= 100
/**
* 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 recursive(TreeNode* left, TreeNode* right) {
// 如果两个子树都为空,则它们对称,返回true
if (!left && !right) return true;
// 如果一个子树为空,而另一个子树不为空,则不对称,返回false
else if (left && !right) return false;
else if (!left && right) return false;// 如果两个子树的根节点值不相等,则不对称,返回false
if (left->val != right->val) return false;
// 递归检查左子树的左子节点与右子树的右子节点是否对称,以及
// 左子树的右子节点与右子树的左子节点是否对称
bool flag = recursive(left->left, right->right);
bool flag1 = recursive(left->right, right->left);// 只有当左右两侧子树都对称时,返回true;否则返回false
return flag && flag1;
}// 检查整个树是否是对称的
bool isSymmetric(TreeNode* root) {
// 如果根节点为空,树是对称的,返回true
if (!root) return true;// 调用递归函数,检查根节点的左子树和右子树是否是镜像对称的
return recursive(root->left, root->right);
}
};
4.102. 二叉树的层序遍历
给你二叉树的根节点 root
,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。
示例 1:
输入:root = [3,9,20,null,null,15,7] 输出:[[3],[9,20],[15,7]]
示例 2:
输入:root = [1] 输出:[[1]]
示例 3:
输入:root = [] 输出:[]
提示:
- 树中节点数目在范围
[0, 2000]
内 -1000 <= Node.val <= 1000
// 二叉树的遍历
/**
* 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:
vector<vector<int>> result; // 存储每一层节点值的结果
// 层次遍历二叉树
vector<vector<int>> levelOrder(TreeNode* root) {
if (!root) return {}; // 如果根节点为空,返回空的二维向量
queue<TreeNode*> q; // 创建一个队列用于存储待遍历的节点
q.push(root); // 将根节点入队
// 当队列不为空时,继续遍历
while (!q.empty()) {
int n = q.size(); // 当前层的节点数量
vector<int> v1; // 用于存储当前层的节点值
// 遍历当前层的所有节点
for (int i{}; i < n; ++i) {
TreeNode* node = q.front(); // 获取队列的前端节点
q.pop(); // 将该节点出队
v1.emplace_back(node->val); // 将该节点的值添加到当前层结果中
// 将左右子节点入队(如果存在)
if (node->left) q.push(node->left);
if (node->right) q.push(node->right);
}
result.push_back(v1); // 将当前层的节点值存入结果中
}
return result; // 返回结果
}
};