广义表和二叉树的转换

来源:互联网 发布:罗马复兴兵种数据 编辑:程序博客网 时间:2024/05/29 14:10
//广义表转二叉树:
设置一个标记变量k,初始值为-1;
设置一个标记结点p;
循环遍历广义表的字符串str;
    如果str[i]是左括号:
        则设置k为0;
        把p压入栈中。
    否则如果str[i]是逗号:
        则设置k为1。
    否则如果str[i]是右括号:
        则栈顶元素出栈。
    否则如果str[i]是一个字母,用结点temp来存储:
        如果k为-1:
            则把temp作为根结点并压入栈中。
        如果k为0:
            如果此时栈顶结点是p,则先出栈;
            然后将temp作为栈顶结点的左孩子;
            再把temp压入栈中。
        如果k为1:
            栈顶元素出栈;
            将temp作为栈顶结点的右孩子;

            再把temp压入栈中。

struct Node{    char data;    Node *lchild=NULL,*rchild=NULL;};typedef struct Node node;node* build(const string &str){    node *root = NULL;    unsigned long max_length=str.length();    int k=-1;    int top=-1;    node *p;    node *temp;    node* Stack[max_length];    for(int i=0;i<max_length;i++){        if(str[i]=='('){            k=0;            top++;            Stack[top]=p;        }        else if(str[i]==','){            k=1;        }        else if(str[i]==')'){            top--;        }        else if(isalpha(str[i])){            temp=new node;            temp->data=str[i];            if(k==-1){                root=temp;                top++;                Stack[top]=temp;            }            else if(k==0){                if(Stack[top]==p){  //这个if语句只是为了代码的可读性,可以不写                    top--;                }                Stack[top]->lchild=temp;                top++;                Stack[top]=temp;            }            else if(k==1){                top--;                Stack[top]->rchild=temp;                top++;                Stack[top]=temp;            }        }    }    return root;}
//二叉树转广义表
输出结点存储的值;
如果左孩子不为空:
    输出"(";
    递归输出左子树;
    如果右子树为空:
        输出",)" 。
如果右孩子不为空:
    如果左孩子为空:
        输出"("。
    输出",";
    递归输出右子树;
    输出")"。
void print_list(node* cur_node){    cout<<cur_node->data;    if(cur_node->lchild!=NULL){        cout<<"(";        print_list(cur_node->lchild);        if(cur_node->rchild==NULL){            cout<<",)";    //可为cout<<")"        }    }    if(cur_node->rchild!=NULL){        if(cur_node->lchild==NULL){            cout<<"(";        }        cout<<",";        print_list(cur_node->rchild);        cout<<")";    }}


原创粉丝点击