从 C 中的字符串构建一棵树在二叉树中定义

问题描述

我在 C 中构建树时遇到问题。我尝试使用堆栈来处理嵌套括号,但是我构建的树是错误的。我发现堆栈指针有问题,太难了,我无法修复错误

树是这样构建的:

enter image description here

Fatal error encountered attempting to read the resultset.

解决方法

在我的 C++ 实现中,我在这里使用了两个堆栈,尽管空间补偿仍然是 O(N)。

#include<bits/stdc++.h>
using namespace std;

struct node {
    char data;
    struct node* FirstChild;
    struct node* NextSibling;
    node(char data_) {
        data = data_;
        FirstChild = nullptr;
        NextSibling = nullptr;
    }
};

node *root = nullptr;

node *make_node(char data) {
    node *n = new node(data);
    
    if(root == nullptr) {
        root = n;
        //cout<<"rt "<<n->data<<endl;
    }
    return n;
}


void print_family(node* b,int i) {
    int cnt;
    if (b) {
        for (cnt = 1; cnt < i; cnt++)
            cout << " ";
        cout << b->data << endl;
        print_family(b->FirstChild,i + 1);
        print_family(b->NextSibling,i);
    }
}

void make_tree(string s) {

    stack<node*> st;
    stack<node*> parent;


    for(int i = 0; i < s.length(); i++) {
        if(s[i+1] == '(') {
            node *n = make_node(s[i]);
            st.push(n);
            parent.push(n);
            
        else if(s[i] == ')') {

            vector<node*> pipe;
            
            while(1) {
                if(st.top()->data == parent.top()->data){
                    break;
                }
                pipe.push_back(st.top());
                st.pop();

            }


            if(pipe.size() <= 2) {
                parent.top()->FirstChild = pipe[0];
                if(pipe.size() == 2){
                    parent.top()->FirstChild->NextSibling = pipe[1];
                }
            }

            parent.pop();
        }
        else{
            if(s[i] != ',' and s[i] != '(')
                st.push(make_node(s[i]));
        }
    }
}



int main() {
    string s = "a(b(d,e),c(g(s),f))";

    make_tree(s);


    print_family(root,5);

}

输出 enter image description here