LCT0226 翻转二叉树
// 二叉树结构体指针解法
#include <bits/stdc++.h>
using namespace std;
struct TreeNode { // 定义二叉树的结点结构体
int val; // 结点的值
TreeNode *left; // 左子结点
TreeNode *right; // 右子结点
TreeNode() : val(INT_MIN), 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) {} // 构造函数
};
TreeNode* invertTree(TreeNode* root) {
if (root == nullptr) { // 如果二叉树为空
return nullptr; // 返回空指针
}
TreeNode* left = invertTree(root->left); // 将左子树的根结点赋值给指针变量left
TreeNode* right = invertTree(root->right); // 将右子树的根结点赋值给指针变量right
root->left = right; // 将指针变量right赋值给结点root的左子结点
root->right = left; // 将指针变量left赋值给结点root的右子结点
return root; // 返回结点root
}
TreeNode *buildTree(vector<int> &nums, int index) { // 建立二叉树
if (index >= int(nums.size())) { // 如果index大于等于数组nums的长度
return nullptr; // 返回空指针
}
TreeNode *root = new TreeNode(nums[index]); // 创建二叉树的根结点
root->left = buildTree(nums, 2 * index + 1); // 创建二叉树的左子树
root->right = buildTree(nums, 2 * index + 2); // 创建二叉树的右子树
return root; // 返回结点root
}
void printLevelOrder(TreeNode *root) { // 层序遍历输出
if (!root) return;
queue<TreeNode *> que;
que.push(root);
while (!que.empty()) {
TreeNode *p = que.front();
que.pop();
cout << p->val << " ";
if (p->left) que.push(p->left);
if (p->right) que.push(p->right);
}
}
void printPreOrder(TreeNode *root) { // 先序遍历输出
if (!root) return;
cout << root->val << " ";
printPreOrder(root->left);
printPreOrder(root->right);
}
void printInOrder(TreeNode *root) { // 中序遍历输出
if (!root) return;
printInOrder(root->left);
cout << root->val << " ";
printInOrder(root->right);
}
void printPostOrder(TreeNode *root) { // 后序遍历输出
if (!root) return;
printPostOrder(root->left);
printPostOrder(root->right);
cout << root->val << " ";
}
int main() {
int num;
vector<int> nums; // 定义vector容器nums
while(cin >> num) nums.push_back(num); // 输入二叉树的结点值
TreeNode *root = buildTree(nums, 0); // 建立二叉树
TreeNode *ans = invertTree(root); // 将函数invertTree的返回值赋值给指针变量ans
printLevelOrder(ans); // 层序遍历输出
return 0;
}
LCT0102 二叉树的层序遍历
// 二叉树的层序遍历:队列,将根节点入队,当队列不为空时,将队列中的元素出队,将出队元素的左右子树入队,将出队元素的值加入到数组中
#include <bits/stdc++.h>
using namespace std;
struct TreeNode {
int val;
TreeNode *left, *right;
TreeNode() : val(INT_MIN), left(nullptr), right(nullptr) {} // 构造函数
TreeNode(int _val) : val(_val), left(nullptr), right(nullptr) {} // 构造函数
TreeNode(int _val, TreeNode *_left, TreeNode *_right) : val(_val), left(_left), right(_right) {} // 构造函数
};
vector<vector<int>> levelOrder(TreeNode* root) {
vector<vector<int>> res; // 定义二维数组
if (!root) return res; // 如果根节点为空,返回空数组
queue<TreeNode*> q; // 定义队列
q.push(root); // 将根节点入队
while (!q.empty()) { // 当队列不为空时
int size = q.size(); // 定义size等于队列的大小
vector<int> tmp; // 定义一维数组
for (int i = 0; i < size; i++) { // 遍历队列
TreeNode *node = q.front(); // 定义node等于队首元素
q.pop(); // 将队首元素出队
tmp.push_back(node->val); // 将队首元素的值加入到一维数组中
if (node->left) q.push(node->left); // 如果队首元素的左子树不为空,将左子树入队
if (node->right) q.push(node->right); // 如果队首元素的右子树不为空,将右子树入队
}
res.push_back(tmp); // 将一维数组加入到二维数组中
}
return res; // 返回二维数组
}
TreeNode *buildTree(vector<int> &nums, int index) { // 建立二叉树
if (index >= int(nums.size()) || nums[index] == INT_MIN) return nullptr; // 如果index大于等于数组长度或者数组元素为-1,返回空指针
TreeNode *root = new TreeNode(nums[index]); // 建立根节点
root->left = buildTree(nums, 2 * index + 1); // 建立左子树
root->right = buildTree(nums, 2 * index + 2); // 建立右子树
return root; // 返回根节点
}
int main() {
string s;
int num;
vector<int> nums;
while (cin >> s) {
if (s == "null") num = INT_MIN; // 如果s等于null,num等于 INT_MIN
else num = stoi(s); // 否则num等于s
nums.push_back(num);
if (cin.get() == '\n') break;
}
TreeNode *root = buildTree(nums, 0); // 建立二叉树
vector<vector<int>> res = levelOrder(root); // 二叉树的层序遍历
for (int i = 0; i < int(res.size()); i++) { // 遍历二维数组
for (int j = 0; j < int(res[i].size()); j++) { // 遍历一维数组
cout << res[i][j] << " "; // 输出数组元素
}
cout << endl;
}
return 0;
}
LCT0101 对称二叉树
// 对称二叉树:递归,如果左子树的左子树等于右子树的右子树,且左子树的右子树等于右子树的左子树,说明是对称二叉树
#include <bits/stdc++.h>
using namespace std;
struct TreeNode {
int val;
TreeNode *left, *right;
TreeNode() : val(INT_MIN), left(nullptr), right(nullptr) {} // 构造函数
TreeNode(int _val) : val(_val), left(nullptr), right(nullptr) {} // 构造函数
TreeNode(int _val, TreeNode *_left, TreeNode *_right) : val(_val), left(_left), right(_right) {} // 构造函数
};
bool isSymmetric(TreeNode* left, TreeNode* right) {
if (!left && !right) return true; // 如果左子树和右子树都为空,返回true
if (!left || !right) return false; // 如果左子树和右子树有一个为空,返回false
return left->val == right->val && isSymmetric(left->left, right->right) && isSymmetric(left->right, right->left); // 返回左子树的左子树等于右子树的右子树,且左子树的右子树等于右子树的左子树
}
bool isSymmetric(TreeNode* root) {
if (!root) return true; // 如果根节点为空,返回true
return isSymmetric(root->left, root->right); // 返回左子树和右子树是否对称
}
TreeNode *buildTree(vector<int> &nums, int index) { // 建立二叉树
if (index >= int(nums.size()) || nums[index] == INT_MIN) return nullptr; // 如果index大于等于数组长度或者数组元素为-1,返回空指针
TreeNode *root = new TreeNode(nums[index]); // 建立根节点
root->left = buildTree(nums, 2 * index + 1); // 建立左子树
root->right = buildTree(nums, 2 * index + 2); // 建立右子树
return root; // 返回根节点
}
int main() {
string s;
int num;
vector<int> nums;
while (cin >> s) {
if (s == "null") num = INT_MIN; // 如果s等于null,num等于 INT_MIN
else num = stoi(s); // 否则num等于s
nums.push_back(num);
if (cin.get() == '\n') break;
}
TreeNode *root = buildTree(nums, 0); // 建立二叉树
bool res = isSymmetric(root); // 判断是否是对称二叉树
cout << (res ? "true" : "false") << endl;
return 0;
}
LCT0104 二叉树的最大深度
#include <bits/stdc++.h>
using namespace std;
struct TreeNode {
int val;
TreeNode *left, *right;
TreeNode() : val(INT_MIN), left(nullptr), right(nullptr) {} // 构造函数
TreeNode(int _val) : val(_val), left(nullptr), right(nullptr) {} // 构造函数
TreeNode(int _val, TreeNode *_left, TreeNode *_right) : val(_val), left(_left), right(_right) {} // 构造函数
};
int maxDepth(TreeNode* root) {
if (!root) return 0; // 如果根节点为空,返回0
return max(maxDepth(root->left), maxDepth(root->right)) + 1; // 返回左子树的最大深度和右子树的最大深度的最大值加1
}
TreeNode *buildTree(vector<int> &nums, int index) { // 建立二叉树
if (index >= int(nums.size()) || nums[index] == INT_MIN) return nullptr; // 如果index大于等于数组长度或者数组元素为-1,返回空指针
TreeNode *root = new TreeNode(nums[index]); // 建立根节点
root->left = buildTree(nums, 2 * index + 1); // 建立左子树
root->right = buildTree(nums, 2 * index + 2); // 建立右子树
return root; // 返回根节点
}
int main() {
string s;
int num;
vector<int> nums;
while (cin >> s) {
if (s == "null") num = INT_MIN; // 如果s等于null,num等于 INT_MIN
else num = atoi(s.c_str()); // 否则num等于s
nums.push_back(num);
if (cin.get() == '\n') break;
}
TreeNode *root = buildTree(nums, 0); // 建立二叉树
int res = maxDepth(root);
cout << res << endl;
return 0;
}
LCT0124 二叉树的最大路径和
#include <bits/stdc++.h>
using namespace std;
struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode() : val(0), left(nullptr), right(nullptr) {}
TreeNode(int _val) : val(_val), left(nullptr), right(nullptr) {}
TreeNode(int _val, TreeNode *_left, TreeNode *_right) : val(_val), left(_left), right(_right) {}
};
int res = INT_MIN;
int dfs(TreeNode *root) {
if (!root) return 0;
int left = max(0, dfs(root->left));
int right = max(0, dfs(root->right));
res = max(res, left + right + root->val);
return max(left, right) + root->val;
}
int maxPathSum(TreeNode *root) {
dfs(root);
return res;
}
int main() {
int val;
string s;
cin >> val;
TreeNode *root = new TreeNode(val);
queue<TreeNode*> q;
q.push(root);
while (cin >> s) {
if (s == "null") {
q.front()->left = nullptr;
} else {
val = stoi(s);
TreeNode *node = new TreeNode(val);
q.front()->left = node;
q.push(node);
}
cin >> s;
if (s == "null") {
q.front()->right = nullptr;
} else {
val = stoi(s);
TreeNode *node = new TreeNode(val);
q.front()->right = node;
q.push(node);
}
q.pop();
if (cin.get() == '\n') break;
}
cout << maxPathSum(root) << endl;
return 0;
}
LCT0987 二叉树的垂直遍历
// 深搜
#include <bits/stdc++.h>
using namespace std;
struct TreeNode {
int val;
TreeNode *left, *right;
TreeNode() : val(0), left(nullptr), right(nullptr) {}
TreeNode(int _val) : val(_val), left(nullptr), right(nullptr) {}
TreeNode(int _val, TreeNode *_left, TreeNode *_right) : val(_val), left(_left), right(_right) {}
};
void dfs(TreeNode *root, int x, int y, map<int, map<int, vector<int>>> &mp) {
if (root == nullptr) return ;
mp[x][y].push_back(root->val); // 将节点的值加入到哈希表中
dfs(root->left, x - 1, y + 1, mp); // 递归遍历左子树
dfs(root->right, x + 1, y + 1, mp); // 递归遍历右子树
}
vector<vector<int>> verticalTraversal(TreeNode *root) {
map<int, map<int, vector<int>>> mp; // 定义哈希表
dfs(root, 0, 0, mp); // 递归遍历二叉树
vector<vector<int>> res;
for (auto it1 = mp.begin(); it1 != mp.end(); it1++) { // 遍历哈希表
vector<int> tmp;
for (auto it2 = it1->second.begin(); it2 != it1->second.end(); it2++) { // 遍历哈希表
sort(it2->second.begin(), it2->second.end()); // 对哈希表中的值进行排序
for (auto it3 = it2->second.begin(); it3 != it2->second.end(); it3++) { // 遍历哈希表
tmp.push_back(*it3); // 将哈希表中的值加入到临时数组中
}
}
res.push_back(tmp); // 将临时数组加入到结果数组中
}
return res;
}
int main() {
int val;
string s;
cin >> val;
TreeNode *root = new TreeNode(val);
queue<TreeNode*> q;
q.push(root);
while (cin >> s) {
if (s == "null") {
q.front()->left = nullptr;
} else {
val = stoi(s);
TreeNode *node = new TreeNode(val);
q.front()->left = node;
q.push(node);
}
cin >> s;
if (s == "null") {
q.front()->right = nullptr;
} else {
val = stoi(s);
TreeNode *node = new TreeNode(val);
q.front()->right = node;
q.push(node);
}
q.pop();
if (cin.get() == '\n') break;
}
vector<vector<int>> res = verticalTraversal(root);
for (int i = 0; i < int(res.size()); i++) {
for (int j = 0; j < int(res[i].size()); j++) {
cout << res[i][j] << " ";
}
cout << endl;
}
return 0;
}