数据结构 括号法二叉树转化为二叉链表链式存储结构
题目:现有用括号表示法表示的二叉树:
"A(B(D(,G)),C(E,F))"
将其转为以二叉链表表现形式的树形结构并用层序遍历输出
实现代码:
代码的核心是第一个build函数中的第一个switch,这个switch决定了下一个节点到底是双亲节点还是孩子节点,决定了到底是左孩子还是右孩子,当前节点应不应该出栈和入栈这三个问题
#include<stdio.h> #include<stdlib.h> #define MAXSIZE 20 typedef struct node { char data; struct node *left; struct node *right; }Node; Node *root=NULL; void build_tree(char *tree) { Node *stack[MAXSIZE]={NULL};int top=-1; Node *p=NULL; int k=3;//当k表示的是1时,表示当前节点将作为栈顶节点的左孩子,2表示栈顶元素的右孩子 while(*tree!='\0') { switch (*tree) { case '('://此时的节点是双亲节点 k=1;//令下一个节点为当前节点的左孩子节点 stack[++top]=p;//如栈当前节点,接收其孩子节点 break; case ','://出现,则表示下一个出现的节点是当前栈顶节点的右孩子 k=2;//置k=1表示下一个节点安排到栈顶节点的右孩子 break; case ')'://出栈当前栈顶节点 top--;//出站操作 break; default://接收到的元素将其改为节点 p=(Node *)malloc(sizeof(Node)); p->data=*tree; p->left=NULL; p->right=NULL; if(root==NULL) root=p; else switch (k) { case 1: stack[top]->left=p; break; case 2: stack[top]->right=p; break; } } ++tree; } } void level(Node *node) { if(node) { Node *queue[MAXSIZE]; int rear=0,front=0; Node *p=NULL; rear=(rear+1)%MAXSIZE; queue[rear]=node; while(rear!=front) { front=(front+1)%MAXSIZE; p=queue[front]; printf("%c\t",p->data); if(p->left) { rear=(rear+1)%MAXSIZE; queue[rear]=p->left; } if(p->right) { rear=(rear+1)%MAXSIZE; queue[rear]=p->right; } } } } int main() { char tree[]="A(B(D(,G)),C(E,F))"; build_tree(tree); level(root); }