首页 > 编程语言 >二叉树广义表的算法生成 (A(B(,D(E,F)),C))

二叉树广义表的算法生成 (A(B(,D(E,F)),C))

时间:2022-10-11 19:33:34浏览次数:44  
标签:ch top 算法 二叉树 广义 printf NULL data BinTNode

 

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

typedef char DataType;

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

typedef BinTNode* BinTree;

void printfNode(BinTNode* b)
{
    printf("%c\n", b->data);
}


BinTNode* CreateTree(char* str)
{
    BinTNode* st[100];   //用指针数组模拟栈
    BinTNode* p = NULL;
    int top, k, j = 0;        //k 标记  1:表示下一个读取的内容是左节点   2 表示右节点 top标记双亲节点
    top = -1;            //置空栈
    char ch = str[j];  //存放广义表的字符串数组
    BinTNode* b = NULL; // b 为null 代表根节点, b isnot null
    while (ch != '\0')
    {
        switch (ch) {
        case '(':
        {
            // 左括号表示新的子树的开始,所以刚建立的节点指针入栈
            top++;
            st[top] = p;
            
            if (p != NULL) {
                printf("第(%d)位:", top);
                printf("%c\n", p->data);
            }
            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;
                    //printf("%s", p->data);
                    printf("第(%d)位的左分支:%c\n", top, p->data);
                    break;
                }
                case 2:
                {
                    st[top]->rchild = p;
                    printf("第(%d)位的右分支:%c\n", top, p->data);
                    break;
                }
                }
            }

        }
        }
        j++;
        ch = str[j];
       
    }
    return b;
}

void main(){
    BinTNode* n = CreateTree("(A(B(,D(E,F)),C))");

    printf("Hello World!\n");
    return 0;
}

  

 

标签:ch,top,算法,二叉树,广义,printf,NULL,data,BinTNode
From: https://www.cnblogs.com/Mengchangxin/p/16782124.html

相关文章

  • 三维目标识别算法综述
    目前三维点云数据的获取方法相对快捷,同时三维点云数据的采集不受光照影响,也规避了二维图像遇到的光照、姿态等问题,因此基于点云数据的三维物体识别也引起了人们的重视。三维......
  • hash算法
    hash算法是将任意长度的二进制值映射为较短的固定长度的二进制值,这个小的二进制值称为哈希值。1、哈希值是一段数据唯一且极其紧凑的数值表示形式。哈希表中元素是由哈希......
  • [Raft共识算法] Dragonboat Log Replication 代码走读
    DragonboatLogReplication代码走读Dragonboat是一个开源的高性能Go实现的Raft共识协议实现.具有良好的性能和久经社区检验的鲁棒性,机遇巧合,接触到.因此决定结合......
  • 【程序员必会十大算法】之动态规划算法(背包问题)
    1.动态规划算法动态规划算法与分治算法类似,其基本思想也是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。与分治法不同的是,适合于用动......
  • 【程序员必会十大算法】之二分查找算法
    1.递归实现①不考虑相同数/***二分查找,不考虑有相同数的情况(递归)*@paramarr*@paramleft*@paramright*@paramfindVal*@return*/publicstaticintbinarySe......
  • 【程序员必会十大算法】之分治算法(汉诺塔问题)
    1.应用分治法是一种很重要的算法。字面上的解释是“分而治之”,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题…直到最后子问题可以简......
  • 平衡二叉树
    代码publicclassMain{publicstaticvoidmain(String[]args){int[]arr={10,11,6,9,7,8};AVLTreebinarySortTree=newAVLTree();fo......
  • 【预测模型-BP分类】基于布谷鸟算法优化BP神经网络实现数据分类附matlab代码
    ✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。......
  • 缺陷检测 | PCB AOI质量检测之自动定位核选取算法
    PCB产品AOI检测,需要将模版与实际图像对齐,因此需要定位功能。定位功能就需要选取定位核,定位核的提取方法分为手动和自动。基于人眼视觉特征对区域敏感度判断的手动提取法存在......
  • 最小生成树prim算法实现
    今天从志权师兄那里学会了最小生成树。所谓生成树,就是n个点之间连成n-1条边的图形。而最小生成树,就是权值(两点间直线的值)之和的最小值。           首先,要用......