用c++的类模板写算法,求任意二叉树中第一条最长的路径长度,并输出此路径上各结点的值
时间: 2024-02-15 09:04:37 浏览: 69
数据结构大作业求二叉树上结点的路径.zip
5星 · 资源好评率100%
好的,这里提供一个类模板的实现。这个类模板具有通用性,可以处理任意类型的二叉树节点。
```cpp
#include <iostream>
#include <vector>
using namespace std;
template<typename T>
struct TreeNode {
T val;
TreeNode<T>* left;
TreeNode<T>* right;
TreeNode(T x) : val(x), left(nullptr), right(nullptr) {}
};
template<typename T>
class Solution {
public:
vector<T> longestPath(TreeNode<T>* root) {
vector<T> path;
dfs(root, path);
return path;
}
private:
int dfs(TreeNode<T>* node, vector<T>& path) {
if (!node) {
return 0;
}
int left_len = dfs(node->left, path);
int right_len = dfs(node->right, path);
int cur_len = max(left_len, right_len) + 1;
if (left_len + right_len + 1 > cur_len) {
cur_len = left_len + right_len + 1;
path = left_path;
path.push_back(node->val);
vector<T> right_path;
dfs(node->right, right_path);
for (int i = right_path.size() - 1; i >= 0; --i) {
path.push_back(right_path[i]);
}
} else if (left_len > right_len) {
path = left_path;
path.push_back(node->val);
} else {
path = right_path;
path.push_back(node->val);
}
return cur_len;
}
};
int main() {
// 构造二叉树
TreeNode<int>* root = new TreeNode<int>(1);
root->left = new TreeNode<int>(2);
root->right = new TreeNode<int>(3);
root->left->left = new TreeNode<int>(4);
root->left->right = new TreeNode<int>(5);
root->right->left = new TreeNode<int>(6);
root->right->right = new TreeNode<int>(7);
// 求最长路径
Solution<int> sol;
vector<int> path = sol.longestPath(root);
cout << "最长路径长度为:" << path.size() << endl;
cout << "最长路径上的节点值为:";
for (int i = 0; i < path.size(); ++i) {
cout << path[i] << " ";
}
cout << endl;
return 0;
}
```
这个类模板的实现与前面的Python代码类似,采用深度优先搜索(DFS)的方式计算最长路径长度,并记录最长路径上的节点值。不同的是,这里使用了模板类和模板函数,使得代码更加通用。
阅读全文