根据输入构造二叉树,输出该二叉树的先序序列。二叉树共有N个节点,节点编号是1到N。约定1号节点是根节点。
时间: 2024-03-05 20:50:31 浏览: 83
使用先序,中序,后序遍历二叉树
题目描述有点简略,不过我们可以根据输入数据的格式,逐行读入并构建二叉树,最后输出先序序列。
假设输入数据格式如下:
- 第1行是一个整数N,表示二叉树的节点数;
- 接下来N行,每行包含三个整数,分别是该节点的编号、左子节点的编号(如果没有左子节点则为0)、右子节点的编号(如果没有右子节点则为0)。
那么我们可以按照以下步骤来解决这个问题:
1. 定义二叉树节点结构体
```c++
struct TreeNode {
int val;
TreeNode* left;
TreeNode* right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
```
2. 定义递归函数 `buildTree`
```c++
TreeNode* buildTree(vector<int>& preorder, int preStart, int preEnd, unordered_map<int, int>& inorderMap) {
if (preStart > preEnd) {
return NULL;
}
int rootVal = preorder[preStart];
TreeNode* root = new TreeNode(rootVal);
int inorderIndex = inorderMap[rootVal];
int leftTreeSize = inorderIndex - preStart;
root->left = buildTree(preorder, preStart + 1, preStart + leftTreeSize, inorderMap);
root->right = buildTree(preorder, preStart + leftTreeSize + 1, preEnd, inorderMap);
return root;
}
```
3. 读入输入数据,构建二叉树
```c++
int n;
cin >> n;
vector<int> preorder(n);
unordered_map<int, int> inorderMap;
int val, left, right;
for (int i = 0; i < n; i++) {
cin >> val >> left >> right;
preorder[i] = val;
inorderMap[val] = i;
}
TreeNode* root = buildTree(preorder, 0, n - 1, inorderMap);
```
4. 输出先序序列
```c++
void preorderTraversal(TreeNode* root) {
if (root == NULL) {
return;
}
cout << root->val << " ";
preorderTraversal(root->left);
preorderTraversal(root->right);
}
preorderTraversal(root);
```
完整代码如下:
阅读全文