yangzhixiaohuli 发表于 2024-11-15 16:14:22

按层次遍历二叉树


以字符串的形式定义一棵二叉树的先序序列,若字符是‘#’, 表示该二叉树是空树,否则该字符是相应结点的数据元素。读入相应先序序列,建立二叉树,然后按层次遍历该二叉树并输出结点数据。

输入格式:
字符串形式的先序序列(即结点的数据类型为单个字符)

输出格式:
按层次遍历二叉树的结果

输入样例:
在这里给出一组输入。例如:

ABDG##HI####CE#J##F##
输出样例:
在这里给出相应的输出。例如:

ABCDEFGHJI

这题用C或者C++怎么做

FishC 发表于 2024-11-15 16:35:00

为了实现这个问题,我们需要执行两个主要步骤:首先根据给定的先序序列构建二叉树,然后对构建的二叉树进行层次遍历。下面是一个用C++实现这个过程的简单代码示例。

#include <iostream>
#include <queue>
#include <string>

using namespace std;

// 定义二叉树节点
struct TreeNode {
    char data;
    TreeNode* left;
    TreeNode* right;
    TreeNode(char val) : data(val), left(nullptr), right(nullptr) {}
};

// 根据先序序列构建二叉树
TreeNode* buildTree(const string& preorder, int& index) {
    if (index >= preorder.length() || preorder == '#') {
      index++;
      return nullptr;
    }
   
    TreeNode* root = new TreeNode(preorder);
    root->left = buildTree(preorder, index);
    root->right = buildTree(preorder, index);
    return root;
}

// 层次遍历二叉树
void levelOrderTraversal(TreeNode* root) {
    if (!root) return;
   
    queue<TreeNode*> q;
    q.push(root);
    while (!q.empty()) {
      TreeNode* current = q.front();
      q.pop();
      
      cout << current->data;
      
      if (current->left) {
            q.push(current->left);
      }
      if (current->right) {
            q.push(current->right);
      }
    }
}

int main() {
    string preorder;
    cin >> preorder;// 输入二叉树的先序序列

    // 初始化索引,用于构建二叉树
    int index = 0;
    TreeNode* root = buildTree(preorder, index);
   
    // 层次遍历
    levelOrderTraversal(root);

    return 0;
}

### 代码解析:

1. **TreeNode 结构体**:定义二叉树节点,包含节点数据和左右子节点指针。

2. **buildTree 函数**:递归地根据先序序列构建二叉树。如果当前字符是 `#`,表示为空;否则创建节点,并递归构建左右子树。

3. **levelOrderTraversal 函数**:使用队列实现层次遍历(广度优先遍历)。从根节点开始,依次访问节点的左、右子节点。

4. **主函数**:读取输入的先序序列,调用 `buildTree` 构建二叉树,最后调用 `levelOrderTraversal` 输出按层次遍历结果。

使用该程序可以解析给定的二叉树先序序列,并按要求输出层次遍历的结果。输入样例和输出遵循题目要求。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
页: [1]
查看完整版本: 按层次遍历二叉树