zoukankan      html  css  js  c++  java
  • 数据结构 括号法二叉树转化为二叉链表链式存储结构

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

    "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!='')
        {
            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	",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);
    }
  • 相关阅读:
    宝宝的成长脚印9/2
    宝宝的成长脚印9/5
    手动作花灯10/6
    EasyUI中EasyLoader加载数组模块
    easyui常用属性
    VS2010如何在一个web项目中使用APP_CODE下的自定义类
    MSSQL系统常用视图命令及其作用
    db_autopwn渗透流程
    渗透测试工具Nmap从初级到高级
    EasyUI中在表单提交之前进行验证
  • 原文地址:https://www.cnblogs.com/oldfish123/p/13813126.html
Copyright © 2011-2022 走看看