//广义表转二叉树:
设置一个标记变量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作为栈顶结点的右孩子;
输出结点存储的值;
如果左孩子不为空:
输出"(";
递归输出左子树;
如果右子树为空:
输出",)" 。
如果右孩子不为空:
如果左孩子为空:
输出"("。
输出",";
递归输出右子树;
输出")"。
设置一个标记变量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<<")";
}
}