持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第17天,点击查看活动详情
前言
Hello!
非常感谢您阅读海轰的文章,倘若文中有错误的地方,欢迎您指出~
自我介绍 ଘ(੭ˊᵕˋ)੭
昵称:海轰
标签:程序猿|C++选手|学生
简介:因C语言结识编程,随后转入计算机专业,获得过国家奖学金,有幸在竞赛中拿过一些国奖、省奖...已保研。
学习经验:扎实基础 + 多做笔记 + 多敲代码 + 多思考 + 学好英语!
唯有努力💪
知其然 知其所以然!
本文只记录感兴趣的部分
每日一题
题目
给定一个二叉树的根节点 root ,返回 它的 中序 遍历 。
示例 1:
输入:root = [1,null,2,3]
输出:[1,3,2]
示例 2:
输入:root = []
输出:[]
示例 3:
输入:root = [1]
输出:[1]
提示:
- 树中节点数目在范围 [0, 100] 内
- -100 <= Node.val <= 100
解答
加强一下迭代的思路
使用stack模拟中序遍历就可以了
- 不断寻找最左节点
- 获取栈顶元素 压入ans
- 转入右子树
class Solution {
public:
vector<int> inorderTraversal(TreeNode* root) {
vector<int> ans;
stack<TreeNode*> s;
while(root || !s.empty()) {
while(root) {
s.push(root);
root = root->left;
}
TreeNode* node = s.top();
s.pop();
ans.push_back(node->val);
root = node->right;
}
return ans;
}
};
题目
给你一个整数 n ,求恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉搜索树 有多少种?返回满足题意的二叉搜索树的种数。
示例 1:
输入:n = 3
输出:5
示例 2:
输入:n = 1
输出:1
提示:
- 1 <= n <= 19
解答
看到题目思考了一会
猜测是一道数学题
想到估计是一道动态规划
但是没有找到动态关系
看了官方题解
依据思路,得到代码
class Solution {
public:
int numTrees(int n) {
vector<int> G(n + 1, 0);
G[0] = 1;
G[1] = 1;
for(int i = 2; i <= n; ++i) {
for(int j = 1; j <= i; ++j) {
G[i] += G[j - 1] * G[i - j];
}
}
return G[n];
}
};
还有数学方法(果然)
class Solution {
public:
int numTrees(int n) {
long long c;
c = 1;
for(int i = 0; i < n; ++i) {
c = c * (2 * (2 * i + 1)) / (i + 2) ;
}
return c;
}
};
总结
- 尽管能猜到题会用什么方法
- 但还是想不出来
- 还是得多练习 多总结
- 居然这道题以前做了
- 需要加深印象!
结语
文章仅作为个人学习笔记记录,记录从0到1的一个过程
希望对您有一点点帮助,如有错误欢迎小伙伴指正