.以二叉链表作为二叉树的存储结构。设计算法求二叉树中第一条最长的路径长度,并输出此路径上各结点的值。要求:(1)给出二叉链表中结点类型BTNode定义;(2)给出算法的基本设计思想;(3)根据设计思想,采用C或者C++语言描述算法。
时间: 2023-12-14 21:39:40 浏览: 56
(1) 二叉链表中结点类型BTNode定义如下:
```c++
typedef struct BTNode{
char data;
struct BTNode *lchild, *rchild;
}BTNode, *BiTree;
```
(2) 算法的基本设计思想:
- 从根节点开始,分别求左子树和右子树的最长路径长度。
- 对于每个节点,我们计算其左子树的最大深度和右子树的最大深度,然后将它们相加,就得到了该节点的最长路径长度。
- 在计算每个节点的最长路径长度的同时,记录下每个节点的父节点指针,方便后续输出路径上的节点值。
- 遍历整棵二叉树,找到最长路径长度以及对应的路径上的节点值。
(3) C++代码实现如下:
```c++
#include<iostream>
#include<vector>
using namespace std;
typedef struct BTNode{
char data;
struct BTNode *lchild, *rchild;
}BTNode, *BiTree;
void build_tree(BiTree &root){
char c;
cin >> c;
if(c == '#') root = NULL;
else{
root = new BTNode;
root->data = c;
build_tree(root->lchild);
build_tree(root->rchild);
}
}
int get_depth(BiTree root, BiTree parent, vector<char> &path){
if(!root) return 0;
int left_depth = get_depth(root->lchild, root, path);
int right_depth = get_depth(root->rchild, root, path);
if(left_depth + right_depth + 1 > path.size()){
path.clear();
path.push_back(root->data);
if(left_depth > right_depth) path.insert(path.end(), path.begin(), path.end() + left_depth);
else path.insert(path.end(), path.begin(), path.end() + right_depth);
}
return max(left_depth, right_depth) + 1;
}
void print_path(vector<char> path){
for(int i = 0; i < path.size(); i++){
cout << path[i] << " ";
}
cout << endl;
}
int main(){
BiTree root;
build_tree(root);
vector<char> path;
int max_depth = get_depth(root, NULL, path);
cout << "最长路径长度:" << max_depth << endl;
cout << "最长路径上的节点值:";
print_path(path);
return 0;
}
```
阅读全文