西北工业大学noj数据结构015建立二叉树的二叉链表存储结构(严6.70)

在这里插入图片描述
在这里插入图片描述
这道题考察最基础的二叉链表建立,值得注意的一点是这道题输入形式是以广义表的格式输入,因此创建的函数有些不同
创建二叉树函数:

void CreateBiTree(BiTree* p)
{
    char c, s;
    (*p) = (BiTree)malloc(sizeof(BiTNode));//申请空间初始化
    c = getchar();
    s = c;
    c = getchar();
    (*p)->LChild = NULL;
    (*p)->RChild = NULL;
    if (s == ',')//如果,出现说明该节点是上一个节点的右子树
    {
        (*p)->data = c;
        s = getchar();
        if (s == '(')//(出现说明要开辟新的子节点
        {
            CreateBiTree(&((*p)->LChild));
            CreateBiTree(&((*p)->RChild));
        }
    }
    else //没有,说明后面要创建新的子树
    {
        (*p)->data = s;
        if (c == '(') 
        {
            CreateBiTree(&((*p)->LChild));
            CreateBiTree(&((*p)->RChild));
        }
    }
}

基本思路是假设输入的节点为x
如果出现“,x”的情况,说明x是上一个节点的右节点;
如果出现x前没有“,",说明是左节点或者根节点;
剩下要说的都在注释里了话不多说上代码

#include<stdio.h>
#include <stdlib.h>
#define ok 1
#define error 0
#define max 1000
typedef struct Node
{
	char data;
	struct Node* LChild;
	struct Node* RChild;
}BiTNode,*BiTree;

//构建二叉树

void CreateBiTree(BiTree* p)
{
    char c, s;
    (*p) = (BiTree)malloc(sizeof(BiTNode));//申请空间初始化
    c = getchar();
    s = c;
    c = getchar();
    (*p)->LChild = NULL;
    (*p)->RChild = NULL;
    if (s == ',')//如果,出现说明该节点是上一个节点的右子树
    {
        (*p)->data = c;
        s = getchar();
        if (s == '(')//(出现说明要开辟新的子节点
        {
            CreateBiTree(&((*p)->LChild));
            CreateBiTree(&((*p)->RChild));
        }
    }
    else //没有,说明后面要创建新的子树
    {
        (*p)->data = s;
        if (c == '(') 
        {
            CreateBiTree(&((*p)->LChild));
            CreateBiTree(&((*p)->RChild));
        }
    }
}

void visit(char c)//这里要求遍历操作是输出节点的值,将visit函数独立还可以通过修改visit函数实现其他操作
{
    printf("%c", c);
}

void PreOrder(BiTree root)//先序遍历二叉树
{
    if (root != NULL)
    {
        visit(root->data);
        PreOrder(root->LChild);
        PreOrder(root->RChild);
    }
}

int main()
{
    BiTree p;
    CreateBiTree(&p);
    PreOrder(p);
    return 0;
}
/*
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值