【问题标题】:Build a tree(defined in binary trees) from string in C从C中的字符串构建一棵树(在二叉树中定义)
【发布时间】:2021-03-31 06:53:30
【问题描述】:

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

树是这样构建的:

#include <stdio.h>
#include<iostream>
#define MaxSize 30
using namespace std;
typedef char ElemType;
typedef struct Tnodes
{
    ElemType data;
    struct Tnodes* FirstChild;
    struct Tnodes* NextSibling;
} TNode;

void CreateTree(TNode*& Family, char* str)
{
    TNode* St[MaxSize], * p = NULL;
    int top = -1;
    bool k = true;      //if FirstChild or NextSibling
    Family = NULL;
    int j = 0;
    char ch = *(str + j);
    while (ch != '\0')
    {
        switch (ch)
        {
        case '(':top++; St[top] = p; k = true; break;      //if FirstChild,k=true
        case ')':top--;  break;                            
        case ',':k = false;  St[top] = p; break;               //NextSibling ,k=false                   
        default:
            p = (TNode*)malloc(sizeof(TNode));         //pcreat a new node p
            p->data = ch; p->FirstChild = p->NextSibling = NULL;

            if (Family == NULL) 
                Family = p;                          //run for the first node

            else if (k)
                St[top]->FirstChild = p;
            else if (!k)
                St[top]->NextSibling = p;
        }
        j++;
        ch = str[j];
    }
}

//print the tree
void print_family(TNode* 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);
    }
}
int main()
{
    char s[] = "a(b(d,e),c(g(s),f))";
    TNode* Family;
    CreateTree(Family, s);
    print_family(Family, 5);
}

【问题讨论】:

    标签: c data-structures tree


    【解决方案1】:

    在我的 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);
    
    }
    

    输出

    【讨论】:

    • 我想知道该方法是否只构建二叉树,我尝试了“a(b(d,e),c(g(s),f,z))”但我失败了。
    猜你喜欢
    • 1970-01-01
    • 2019-10-18
    • 2015-12-20
    • 2014-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-24
    • 2021-11-23
    相关资源
    最近更新 更多