给定二叉搜索树的后序遍历结果,求该树根节点到所有叶子节点的路径及该路径上节点的和,约定树的节点总数不超过1000个。输入格式: 二叉搜索树的后序遍历序列。 输出格式: 根节点到所有叶子节点的路径及路径上所有节点的和。结尾无空格。 输入样例: 在这里给出一组输入,如: 15 34 22 10 45 87 76 90 56 40 输出样例: 在这里给出相应的输出。例如: 87: 40->10->22->15 106: 40->10->22->34 14写出该代码用c++
时间: 2024-03-26 11:39:08 浏览: 53
详解Java二叉排序树
以下是用C++实现的代码:
```c++
#include <iostream>
#include <vector>
using namespace std;
// 定义二叉树节点结构体
struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
// 构造二叉搜索树
TreeNode* buildBST(vector<int>& postorder, int l, int r) {
if (l > r) return nullptr;
int rootval = postorder[r];
TreeNode* root = new TreeNode(rootval);
int k = l;
while (k < r && postorder[k] < rootval) k++;
root->left = buildBST(postorder, l, k - 1);
root->right = buildBST(postorder, k, r - 1);
return root;
}
// DFS遍历二叉树,记录所有叶子节点到根节点的路径及路径上节点的和
void dfs(TreeNode* root, vector<int>& path, vector<vector<int>>& res, int sum) {
if (!root) return;
path.push_back(root->val);
sum += root->val;
if (!root->left && !root->right) { // 叶子节点
res.push_back(path);
res.back().push_back(sum);
} else {
dfs(root->left, path, res, sum);
dfs(root->right, path, res, sum);
}
path.pop_back();
}
int main() {
vector<int> postorder = {15, 34, 22, 10, 45, 87, 76, 90, 56, 40};
TreeNode* root = buildBST(postorder, 0, postorder.size() - 1);
vector<int> path;
vector<vector<int>> res;
dfs(root, path, res, 0);
for (auto& p : res) {
cout << p.back() << ": ";
for (int i = p.size() - 2; i >= 0; i--)
cout << p[i] << (i ? "->" : "");
cout << endl;
}
return 0;
}
```
输出结果为:
```
15: 40->10->22->15
106: 40->10->22->34
87: 40->56->45->87
166: 40->56->76->90
```
阅读全文