代码随想录算法训练营第十四天 | 144. 二叉树的前序遍历、94. 二叉树的序遍历、145. 二叉树的后序遍历、每日一题 1092. 最短公共序列
题目链接:
递归写法
前序
-
class Solution {
-
public:
-
void dfs(TreeNode* cur, vector<int> &vec){
-
if(cur == nullptr) return;
-
vec.push_back(cur->val);
-
dfs(cur->left, vec);
-
dfs(cur->right, vec);
-
}
-
-
vector<int> preorderTraversal(TreeNode* root) {
-
vector<int> ans;
-
dfs(root, ans);
-
return ans;
-
}
-
};
中序
-
class Solution {
-
public:
-
void dfs(TreeNode* cur, vector<int> &vec){
-
if(cur == nullptr) return;
-
dfs(cur->left, vec);
-
vec.push_back(cur->val);
-
dfs(cur->right, vec);
-
}
-
-
vector<int> inorderTraversal(TreeNode* root) {
-
vector<int> ans;
-
dfs(root, ans);
-
return ans;
-
}
-
};
后序
-
class Solution {
-
public:
-
void dfs(TreeNode* node, vector<int> &ans) {
-
if (node == nullptr) return;
-
dfs(node->left, ans);
-
dfs(node->right, ans);
-
ans.emplace_back(node->val);
-
}
-
-
vector<int> postorderTraversal(TreeNode* root) {
-
vector<int> ans;
-
dfs(root, ans);
-
return ans;
-
}
-
};
迭代写法
前序
-
class Solution {
-
public:
-
vector<int> preorderTraversal(TreeNode* root) {
-
stack<TreeNode*> st;
-
vector<int> ans;
-
if (root == nullptr) return ans;
-
st.push(root);
-
while(!st.empty()){
-
TreeNode* cur = st.top();
-
st.pop();
-
ans.push_back(cur->val);
-
if(cur->right) st.push(cur->right);
-
if(cur->left) st.push(cur->left);
-
}
-
return ans;
-
}
-
};
中序
-
class Solution {
-
public:
-
vector<int> inorderTraversal(TreeNode* root) {
-
stack<TreeNode*> st;
-
vector<int> ans;
-
TreeNode* cur = root;
-
while(cur != nullptr || !st.empty()){
-
if(cur != nullptr){
-
st.push(cur);
-
cur = cur->left;
-
}else {
-
cur = st.top();
-
st.pop();
-
ans.push_back(cur->val);
-
cur = cur->right;
-
}
-
}
-
return ans;
-
}
-
};
后序
利用一个标记位来实现
-
class Solution {
-
public:
-
vector<int> postorderTraversal(TreeNode* root) {
-
vector<int> result;
-
stack<pair<TreeNode*, int>> st;
-
if (root != NULL) st.push({root, 0});
-
while (!st.empty()) {
-
int& flag = st.top().second;
-
TreeNode* cur = st.top().first;
-
if (!flag) {
-
flag = 1;
-
if(cur->right) st.push({cur->right, 0});
-
if(cur->left) st.push({cur->left, 0});
-
} else {
-
result.emplace_back(cur->val);
-
st.pop();
-
}
-
}
-
return result;
-
}
-
};
最长公共子序列的加强题,前半部分动态规划求解一样的代码
后半部分根据状态数组,迭代构造答案
-
class Solution {
-
public:
-
string shortestCommonSupersequence(string &s, string &t) {
-
int n = s.size(), m = t.size();
-
vector<vector<int>> f(n 1, vector<int>(m 1, 0));
-
for (int j = 1; j <= m; j ) f[0][j] = j;
-
for (int i = 1; i <= n; i ) f[i][0] = i;
-
for (int i = 0; i < n; i ) {
-
for (int j = 0; j < m; j ) {
-
if (s[i] == t[j])
-
f[i 1][j 1] = f[i][j] 1;
-
else
-
f[i 1][j 1] = min(f[i][j 1], f[i 1][j]) 1;
-
}
-
}
-
string ans;
-
int i = n - 1, j = m - 1;
-
while (i >= 0 && j >= 0) {
-
if (s[i] == t[j]) {
-
ans = s[i];
-
--i;
-
--j;
-
} else if (f[i 1][j 1] == f[i][j 1] 1){
-
ans = s[i--];
-
} else {
-
ans = t[j--];
-
}
-
}
-
reverse(ans.begin(), ans.end());
-
return s.substr(0, i 1) t.substr(0, j 1) ans;
-
}
-
};
这篇好文章是转载于:学新通技术网
- 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
- 本站站名: 学新通技术网
- 本文地址: /boutique/detail/tanhgfegah
系列文章
更多
同类精品
更多
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
Android 11 保存文件到外部存储,并分享文件
Luke 10-12 -
word里面弄一个表格后上面的标题会跑到下面怎么办
PHP中文网 06-20 -
《学习通》视频自动暂停处理方法
HelloWorld317 07-05 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14 -
微信公众号没有声音提示怎么办
PHP中文网 03-31 -
excel下划线不显示怎么办
PHP中文网 06-23 -
excel打印预览压线压字怎么办
PHP中文网 06-22 -
怎样阻止微信小程序自动打开
PHP中文网 06-13 -
TikTok加速器哪个好免费的TK加速器推荐
TK小达人 10-01