C++ 求解二叉树优美 DFS 序数量问题
以下是解决该问题的 C++ 代码: ```cpp #include <iostream> #include <vector> #include <stack> #define MOD 1000000007 using namespace std; // 定义二叉树节点结构体 struct TreeNode { int left; int right; TreeNode(int l, int r) : left(l), right(r) {} }; // 生成所有可能的 DFS 序 void generateDFS(vector<int>& path, vector<TreeNode>& tree, int node, vector<vector<int>>& dfs_orders) { if (node * 2 > tree.size()) { dfs_orders.push_back(path); return; } path.push_back(node); generateDFS(path, tree, tree[node - 1].left, dfs_orders); generateDFS(path, tree, tree[node - 1].right, dfs_orders); path.pop_back(); } // 判断一个 DFS 序是否优美 bool isBeautiful(const vector<int>& dfs_order, const vector<int>& leaf_values) { stack<int> st; for (int node : dfs_order) { if (node * 2 > leaf_values.size()) { if (!st.empty() && st.top() == leaf_values[node - 1]) { st.pop(); } else { st.push(leaf_values[node - 1]); } } } return st.empty(); } int main() { int c, n; cin >> c >> n; vector<TreeNode> tree(2 * n - 1, {0, 0}); for (int i = 0; i < 2 * n - 1; ++i) { int l, r; cin >> l >> r; tree[i] = TreeNode(l, r); } vector<int> leaf_values(4 * n - 1, 0); for (int i = 0; i < n; ++i) { int a, b; cin >> a >> b; leaf_values[a - 1] = i + 1; leaf_values[b - 1] = i + 1; vector<vector<int>> dfs_orders; vector<int> path; generateDFS(path, tree, 1, dfs_orders); int beautiful_count = 0; for (const auto& order : dfs_orders) { if (isBeautiful(order, leaf_values)) { beautiful_count = (beautiful_count + 1) % MOD; } } cout << beautiful_count << endl; } return 0; } ``` ### 代码解释: 1. **TreeNode 结构体**:用于表示二叉树的节点,包含左右子节点的编号。 2. **generateDFS 函数**:递归生成所有可能的 DFS 序。 3. **isBeautiful 函数**:判断一个 DFS 序是否优美,通过栈来模拟消除相邻相同数字的过程。 4. **main 函数**:读取输入数据,进行操作,并计算每次操作后的优美 DFS 序的数量。 ### 复杂度分析: - **时间复杂度**:生成所有 DFS 序的时间复杂度为 $O(2^{2n - 1})$,判断每个 DFS 序是否优美的时间复杂度为 $O(4n - 1)$,因此总的时间复杂度为 $O(2^{2n - 1} \times (4n - 1))$。 - **空间复杂度**:主要用于存储 DFS 序,空间复杂度为 $O(2^{2n - 1} \times (4n - 1))$。 ######[AI问答 | 884点数解答 | 2026-06-09 14:06:43]
- C++ 破解 4n - 1 结点二叉树优美 DFS 序数量问题:代码、解释与复杂度剖析(字节豆包 | 1304点数解答 | 2026-02-07 20:35:12)47
- C++ 求解二叉树优美 DFS 序数量问题(字节豆包 | 884点数解答 | 2026-06-09 14:06:43)5
- 易语言读取文本文件并显示到超级列表框:代码示例与注意要点(DeepSeek | 571点数解答 | 2025-08-23 20:54:40)275
- 易语言:读取并显示特定文本到超级列表框,还能增加新数据的方法与要点(DeepSeek | 1317点数解答 | 2025-08-23 20:58:40)273
- "Python代码:深度优先搜索判断马在棋盘上是否存在遍历路径"(GPT | 50点数解答 | 2024-11-18 19:36:52)246
- mallshop商城网站:数据库设计与强大业务功能全揭秘(GPT | 257点数解答 | 2024-12-09 14:08:15)313
- 用Python处理商品销售数据:替换类别、合并类目并输出前5行(百度文心 | 486点数解答 | 2024-08-23 09:14:21)333
- Python 破解:计算序列中满足特定取余条件元素的数量(字节豆包 | 174点数解答 | 2025-05-13 21:29:55)209
- 一文搞定!无名杀“再生安瓿”技能代码全解析及注意事项(字节豆包 | 464点数解答 | 2025-06-15 20:06:30)202
- C# 实现商品类:数量限制 100 及开发注意要点(字节豆包 | 737点数解答 | 2025-09-03 14:44:56)122
- 易语言多线程实战:获取进程信息、读写内存与多线程协同操作(字节豆包 | 790点数解答 | 2025-11-28 03:08:24)70
- 易语言多线程:实现获取进程内存数据与C语言格式基址的高效代码示例(字节豆包 | 677点数解答 | 2025-11-28 03:12:31)68