以二叉链表作为二叉树的存储结构。设计算法求二叉树中第一条最长的路径长度,并输出此路径上各结点的值。要求:(1)给出二叉链表中结点类型BTNode定义;(2)给出算法的基本设计思想;(3)根据设计思想,采用C或者C++语言描述算法。
时间: 2024-02-01 17:13:41 浏览: 47
头歌数据结构二叉树的二叉链表存储及基本操作
5星 · 资源好评率100%
1. 结点类型BTNode定义:
```
struct BTNode {
int data;
BTNode* left;
BTNode* right;
};
```
2. 算法的基本设计思想:
从根结点开始,递归地遍历左子树和右子树,并计算左子树的深度和右子树的深度。然后将左子树深度和右子树深度相加,得到当前结点的最长路径长度。同时,记录下左子树最长路径和右子树最长路径,如果左子树最长路径加上右子树最长路径加上1(1表示当前结点)大于当前最长路径,则更新最长路径和对应的路径。
3. C++代码实现:
```cpp
#include <iostream>
#include <vector>
using namespace std;
struct BTNode {
int data;
BTNode* left;
BTNode* right;
};
void dfs(BTNode* root, int& maxLen, vector<int>& path) {
if (!root) return;
vector<int> leftPath, rightPath; // 左右子树路径
dfs(root->left, maxLen, leftPath);
dfs(root->right, maxLen, rightPath);
if (leftPath.size() + rightPath.size() + 1 > maxLen) { // 更新最长路径
maxLen = leftPath.size() + rightPath.size() + 1;
path = leftPath;
path.push_back(root->data);
for (int i = rightPath.size() - 1; i >= 0; --i) {
path.push_back(rightPath[i]);
}
}
int depth = max(leftPath.size(), rightPath.size()) + 1; // 计算当前结点深度
if (depth > maxLen) { // 更新最长路径
maxLen = depth;
path.clear();
path.push_back(root->data);
}
}
void findLongestPath(BTNode* root) {
int maxLen = 0;
vector<int> path;
dfs(root, maxLen, path);
cout << "The longest path length is: " << maxLen << endl;
cout << "The path is: ";
for (int i = 0; i < path.size(); ++i) {
cout << path[i] << " ";
}
cout << endl;
}
int main() {
// 构造二叉树
BTNode* root = new BTNode{1, nullptr, nullptr};
root->left = new BTNode{2, nullptr, nullptr};
root->right = new BTNode{3, nullptr, nullptr};
root->left->left = new BTNode{4, nullptr, nullptr};
root->left->right = new BTNode{5, nullptr, nullptr};
root->right->left = new BTNode{6, nullptr, nullptr};
root->right->right = new BTNode{7, nullptr, nullptr};
// 求解最长路径
findLongestPath(root);
return 0;
}
```
阅读全文