数据结构 括号法二叉树转化为二叉链表链式存储结构

题目:现有用括号表示法表示的二叉树:

"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);
}

 

posted @ 2020-10-14 09:50  雾漫大武汉  阅读(639)  评论(0编辑  收藏  举报