请用程序设计C++编写程序:输入一棵二叉树的带空标记的先序遍历序列,建立二叉链表,计算该二叉树的树高和结点总数
时间: 2025-07-06 15:55:35 浏览: 1
在C++中,我们可以使用递归的方式来解决这个问题。首先,我们需要定义二叉树节点结构,并实现先序遍历过程中构建二叉链表的功能。然后,我们会计算树的高度和节点总数。以下是简单的实现:
```cpp
#include <iostream>
using namespace std;
// 定义二叉树节点
struct TreeNode {
int val;
bool isLeaf; // 空标记
TreeNode *left, *right;
TreeNode(int x, bool leaf = false) : val(x), isLeaf(leaf), left(nullptr), right(nullptr) {}
};
// 先序遍历并建立二叉链表
TreeNode* buildTree(vector<int>& inorder, vector<int>& preorder) {
if (preorder.empty()) return nullptr;
TreeNode* root = new TreeNode(preorder[0]);
int i = 0; // 先序序列的索引
for (int j = 0; j < inorder.size(); ++j) { // 遍历中序序列
if (inorder[j] == root->val) {
root->left = buildTree(inorder.begin() + i, inorder.begin() + j);
root->right = buildTree(inorder.begin() + j + 1, inorder.end());
break;
}
i += inorder[j] == -1 ? 1 : 0; // 如果遇到空标记,跳过
}
return root;
}
// 计算树高度和节点数
pair<int, int> treeHeightAndNodeCount(TreeNode* root) {
int height = 0, nodeCount = 0;
function<void(TreeNode*, int)> dfs = [&](TreeNode* node, int depth) {
if (!node) return;
height = max(height, depth);
nodeCount++;
dfs(node->left, depth + 1);
dfs(node->right, depth + 1);
};
dfs(root, 0);
return make_pair(height, nodeCount);
}
int main() {
vector<int> inorder = {9, 3, 4, 1, 7, -1, -1, 6, 2, -1}; // 假设这是给定的中序遍历序列
vector<int> preorder = {1, 3, 4, 9, 2, 6, 7}; // 先序遍历序列
TreeNode* treeRoot = buildTree(inorder, preorder);
auto result = treeHeightAndNodeCount(treeRoot);
cout << "树的高度: " << result.first << endl;
cout << "节点总数: " << result.second << endl;
// 清理内存
delete treeRoot;
return 0;
}
```
在这个程序中,我们首先通过先序遍历序列构建二叉树,然后通过深度优先搜索算法计算树的高度和节点总数。
阅读全文
相关推荐

















