1、
在深搜的过程中记录下路径上的最大节点值即可
#include <iostream>
#include<stack>
#include<vector>
#include<algorithm>
using namespace std;
struct TreeNode {
int val;
TreeNode* left, * right;
TreeNode(int v) : val(v), left(NULL), right(NULL) {}
};
// 层次遍历构建二叉树
void createTree(vector<int>& nums, int i, int len, TreeNode*& root) {
if (nums[0] == -1 || len == 0)
return;
if (i >= len)//超过数组长度返回
return;
if (nums[i] == -1) {
root = NULL;
}
else {
root = new TreeNode(nums[i]);
createTree(nums, i * 2 + 1, len, root->left); //建立左子树
createTree(nums, i * 2 + 2, len, root->right); //建立右子树
}
}
// 对二叉树进行深度优先搜索
int dfs(TreeNode* root) {
// 栈中存储节点 + 路径上的最大值
stack<pair<TreeNode*, int>> s;
int ans = 0;
TreeNode* tmp = root;
int maxNode = root->val;
while (!s.empty() || tmp) {
while (tmp) {
maxNode = max(maxNode, tmp->val);
s.push({ tmp, maxNode });
// 关键节点
if (tmp->val >= maxNode) {
ans++;
}
tmp = tmp->left;
}
auto node = s.top();
s.pop();
maxNode = node.second;
tmp = node.first->right;
}
return ans;
}
// 先序遍历
void preOrder(TreeNode* root) {
if (root == NULL)
return;
cout << root->val << " ";
preOrder(root->left);
preOrder(root->right);
}
int main() {
int n;
cin >> n;
vector<int> nums(n);
for (int i = 0; i < n; i++) {
cin >> nums[i];
}
TreeNode* root;
createTree(nums, 0, n, root);
cout << "关键节点个数为:" << dfs(root) << endl;
return 0;
} 2、跳台阶问题
简单的动态规划
#include <iostream>
using namespace std;
int main() {
int n;
cin >> n;
// 初始化只有 1 级台阶和 2 级台阶的情况
int dp1 = 1, dp2 = 2;
if (n <= 2) cout << "跳法有: " << n << "种" << endl;
else {
// 迭代求解
for (int i = 3; i <= n; i++) {
int tmp = dp2;
dp2 += dp1;
dp1 = tmp;
}
cout << "跳法有: " << dp2 << "种" << endl;
}
return 0;
} 3、
这道题可以暴力地进行深搜,也就是每个数字选择或者不选择,时间复杂度为 ,我当时稍微做了一下剪枝,好了一点点
#include <iostream>
#include <vector>
using namespace std;
// k 个数字之和为 sum1
int cnt = 0;
int ans[100] = { 0 };
void kSum(vector<int>& nums, int sum1, int idx, int E) {
if (idx >= nums.size() || sum1 <= 0) return;
ans[idx] = 1;
if (sum1 == nums[idx]) {
cnt++;
for (int i = 0; i < nums.size(); i++) {
if (ans[i] == 0 && i == 0) cout << nums[i];
else if (ans[i] == 0 && i > 0) cout << "+" << nums[i];
else cout << "-" << nums[i];
}
cout << "=" << E << endl;
}
// 取第 idx 个数字
kSum(nums, sum1 - nums[idx], idx + 1, E);
ans[idx] = 0;
// 不取第 idx 个数字
kSum(nums, sum1, idx + 1, E);
}
int main() {
int n, sum = 0, E;
cin >> n;
vector<int> nums(n, 0);
for (int i = 0; i < n; i++) {
cin >> nums[i];
sum += nums[i];
}
cin >> E;
if ((sum - E) % 2 != 0) cout << "取法有: " << 0 << endl;
else {
kSum(nums, (sum - E) / 2, 0, E);
cout << "取法有: " << cnt << endl;
}
return 0;
} 
京公网安备 11010502036488号