3 条题解

  • 0
    @ 2024-12-25 12:04:40

    普通结构体- 递归函数返回string类型方法:

    #include <bits/stdc++.h>
    using namespace std;
    // 定义二叉树节点结构
    struct tree {
        char val;
        int left;
        int right;
    };
    // 构建二叉树
    int build(vector<tree>& a, const string& str, int& pos) {
        int len = str.size();
        if (pos >= len) return -1; // 边界条件
        if (str[pos] == '.') { // 空节点
            pos++;
            return -1;
        }
        tree node;
        node.val = str[pos++]; // 当前节点的值
        node.left = build(a, str, pos); // 构建左子树
        node.right = build(a, str, pos); // 构建右子树
        a.push_back(node);
        return a.size() - 1; // 返回当前节点的索引
    }
    // 中序遍历返回字符串
    string instring(const vector<tree>& a, int idx) {
        if (idx == -1) return ""; // 空节点
        string left = instring(a, a[idx].left); // 左子树的中序遍历
        string current(1, a[idx].val);         // 当前节点
        string right = instring(a, a[idx].right); // 右子树的中序遍历
        return left + current + right; // 中序遍历结果
    }
    // 后序遍历返回字符串
    string poststring(const vector<tree>& a, int idx) {
        if (idx == -1) return ""; // 空节点
        string left = poststring(a, a[idx].left); // 左子树的后序遍历
        string right = poststring(a, a[idx].right); // 右子树的后序遍历
        string current(1, a[idx].val);           // 当前节点
        return left + right + current; // 后序遍历结果
    }
    int main() {
        string str;
        int pos = 0;
        cin >> str;
        vector<tree> a; // 节点数组
        int root = build(a, str, pos); // 构建二叉树
        string instr = instring(a, root); // 获取中序遍历结果
        string poststr = poststring(a, root); // 获取后序遍历结果
        cout << instr << endl; // 输出中序遍历
        cout << poststr << endl; // 输出后序遍历
        return 0;
    }
    
    • 0
      @ 2024-12-18 13:38:33

      结构体指针遍历方式:

      #include <bits/stdc++.h>
      using namespace std;
      
      // 定义树的节点结构
      struct TreeNode {
          char val;
          TreeNode* left;
          TreeNode* right;
          TreeNode(char x) : val(x), left(nullptr), right(nullptr) {}
      };
      
      // 使用递归方法根据先序遍历构建二叉树
      TreeNode* buildTree(const string& preOrder, int& index) {
          if (index >= preOrder.size()) return nullptr; // 超出范围
          char current = preOrder[index];
          index++; // 移动到下一个字符
          if (current == '.') return nullptr; // 空节点
          TreeNode* node = new TreeNode(current); // 创建新节点
          node->left = buildTree(preOrder, index); // 构建左子树
          node->right = buildTree(preOrder, index); // 构建右子树
          return node;
      }
      
      // 中序遍历函数,将结果存储在 inOrder 数组中
      void inorderTraversal(TreeNode* root, string& inOrder) {
          if (root == nullptr) return;
          inorderTraversal(root->left, inOrder); // 遍历左子树
          inOrder += root->val; // 访问当前节点
          inorderTraversal(root->right, inOrder); // 遍历右子树
      }
      
      // 后序遍历函数,将结果存储在 postOrder 数组中
      void postorderTraversal(TreeNode* root, string& postOrder) {
          if (root == nullptr) return;
          postorderTraversal(root->left, postOrder); // 遍历左子树
          postorderTraversal(root->right, postOrder); // 遍历右子树
          postOrder += root->val; // 访问当前节点
      }
      
      int main(){
          string preOrder;
          cin >> preOrder; // 读取先序遍历序列,如 ABD..EF..G..C..
          
          int index = 0; // 初始化索引
          TreeNode* root = buildTree(preOrder, index); // 构建二叉树
          
          string inOrder = "";
          inorderTraversal(root, inOrder); // 进行中序遍历
          string postOrder = "";
          postorderTraversal(root, postOrder); // 进行后序遍历
          
          // 输出结果
          cout << inOrder << "\n" << postOrder << "\n";
          
          return 0;
      }
      
      
      • 0
        @ 2024-12-18 13:37:59

        结构体数组遍历方式:

        #include <bits/stdc++.h>
        using namespace std;
        struct treenode {
            char val;
            int left;
            int right;
        };
        // 递归函数,根据先序遍历构建二叉树
        int buildtree(vector<treenode>& nodes, string& str, int& pos) { // 注意这里 pos 改为引用传递
            int len =str.size();
        	if (pos >= len) return -1; // 超出范围
            if (str[pos] == '.') {
                pos++; // 跳过空节点
                return -1;
            }
            treenode node; // 创建当前节点
            node.val = str[pos++];
            node.left = buildtree(nodes, str, pos);  // 构建左子树
            node.right = buildtree(nodes, str, pos); // 构建右子树
            nodes.push_back(node); // 添加到节点数组
            return nodes.size() - 1; // 返回当前节点的索引
        }
        
        // 中序遍历函数
        void inorder(vector<treenode>& nodes, int idx, string& order1) {
            if (idx == -1) return; // 空节点
            inorder(nodes, nodes[idx].left, order1);  // 遍历左子树
            order1 += nodes[idx].val;                 // 访问当前节点
            inorder(nodes, nodes[idx].right, order1); // 遍历右子树
        }
        
        // 后序遍历函数
        void postorder(vector<treenode>& nodes, int idx, string& order2) {
            if (idx == -1) return; // 空节点
            postorder(nodes, nodes[idx].left, order2);  // 遍历左子树
            postorder(nodes, nodes[idx].right, order2); // 遍历右子树
            order2 += nodes[idx].val;                   // 访问当前节点
        }
        int main() {
            string str;
            cin >> str; // 读取先序遍历序列,如 ABD..EF..G..C..
            vector<treenode> nodes; // 节点数组
            int pos = 0;  // 当前解析的位置
            int root = buildtree(nodes, str, pos);
            string inorder_str = "";
            inorder(nodes, root, inorder_str);
            string postorder_str = "";
            postorder(nodes, root, postorder_str);
            cout << inorder_str << "\n" << postorder_str << "\n";
            return 0;
        }
        
        
        • 1

        信息

        ID
        818
        时间
        1000ms
        内存
        256MiB
        难度
        6
        标签
        递交数
        21
        已通过
        10
        上传者