美文网首页
根据一个广义表来创建一个二叉树

根据一个广义表来创建一个二叉树

作者: 喵喵好运 | 来源:发表于2021-01-26 23:21 被阅读0次
  • 根据一个广义表来创建一个二叉树

算法中用了一个指针数组来模拟栈存储结点的双亲指针,根据读入广义表中的字符分四种不同的情况处理:

  1. 子表
  2. 子表嵌套子表
  3. 结点
  4. , 空结点


#include<stdio.h>
#include<stdlib.h>

typedef struct node{
    char data;
    struct node * lchild,* rchild;
} BinTNode;

//实现根据一个广义表创建树
BinTNode * CreateTree(char * str)
{
    //str为存储广义表的字符串的指针
    BinTNode *st[100];//用指针数组模拟栈
    BinTNode *p = NULL;//置空栈
    int top,k=0,j=0;//k 作为一个标记,k=1,读到的下一个字符就是子树
    top = -1;
    BinTNode *b = NULL;
    char ch = str[j];
    while (ch!='\0') {
        switch (ch) {
            case '(':
                top++;
                st[top]=p;
                k=1;
                break;
            case ')':
                top--;
                break;
            case ',':
                k=2;
                break;
            default://读到的是字符,作为结点
                p = (BinTNode *)malloc(sizeof(BinTNode));
                p->data = ch;//填写数据域
                p->lchild=p->rchild=NULL;//填写指针域
                if(b==NULL){//建立第一个结点
                    b=p;
                }else{
                    switch (k) {
                        case 1://前一个字符是‘(’,该结点应该插入左子树
                            st[top]->lchild=p;
                            break;
                        case 2://前一个字符是‘,’,该结点应该插入右子树
                            st[top]->rchild=p;
                            break;
                    }
                }
                break;
        }
        j++;
        ch=str[j];//读取下一个字符
    }
    return b;//返回根结点的指针
}




中间读取的变化

image.png

打印结果

char c_array[15] = {'(','A','(','B','(','D','(','E',',','F',')',')',',','C'};
int main(int argc, const char * argv[]) {
    // insert code here...
    printf("Hello, Miaoyixi!\n");
//    BinTNode *s == NULL;
//    BinTNode CreateTree(BinTNode *s,char * str);
//    for(int i = 0;i<15;i++){
    BinTNode *s = CreateTree(c_array);
//    }
   char t = s->data;
    printf("根节点%c\n",t);
    printf("根左结点%c\n",s->lchild->data);
    printf("根右结点%c\n",s->rchild->data);
    printf("执行ok\n");
//    printf(s->rchild);
//    CreateTree("(A,(B,(C,D)),(,D))");
    return 0;
}

image.png

相关文章

  • 根据一个广义表来创建一个二叉树

    根据一个广义表来创建一个二叉树 算法中用了一个指针数组来模拟栈存储结点的双亲指针,根据读入广义表中的字符分四种不同...

  • java自定义构造二叉树及其遍历

    首先:二叉树的建立 首先,我们采用广义表建立二叉树(关于广义表的概念,请查看百科的介绍:http://baike....

  • sqlserver动态表名查询

    因为表名是根据月份来创建的,所以创建视图需要利用参数作为表名进行查询 可以再加一个语句判断表是否存在

  • 数据结构(广义表)

    1. 广义表的定义 广义表简称表,它是线性表的推广。一个广义表是n(n>=0)个元素的一个有限序列,当n=0时称为...

  • MySQL常用语句

    创建数据库 删除数据库 修改数据库名 创建新表 根据旧表创建新表 删除表 修改表的名字 增加一个列 删除一个列 修...

  • 广义表

    广义表广义表的定义广义表的存储结构广义表的M元多项式广义表的递归算法 一、广义表的定义:广义表(Lists,又称列...

  • MySql数据库·建表三范式

    一、建表时,表里建几个表头,表头叫什么名字,一般通过“ER关系模型” 来创建 (根据存储实体来创建) 二、表创建的...

  • 第二步:操作界面

    此前我们创建了员工表,现在我们要根据员工表中的权限,来创建权限表,用来储存不同权限可以做的事情。 如图,我们先创建...

  • 2018-05-24

    根据二叉树创建字符串

  • 广义表

    1. 广义表:元素为原子项或广义表 A = () —— 空表,长度为0B = (e) —— 表B只有一个原子e,...

网友评论

      本文标题:根据一个广义表来创建一个二叉树

      本文链接:https://www.haomeiwen.com/subject/pkxozktx.html