栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

[数据结构]基于二叉树的家谱系统

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

[数据结构]基于二叉树的家谱系统

实验名称

基于二叉树的家谱系统

实验内容

采用一棵二叉树来表示一个家谱关系,一个家谱可表示为一颗树,首先将其转换成一颗二叉树表示,如下图为红楼梦家谱的一部分:

实验要求

(1) 输入一颗二叉树的括号表示法,完成树的构建
(2) 使用后序遍历递归算法遍历二叉树并输出
(3) 使用先序遍历非递归算法遍历二叉树并输出
(4) 指定家谱中的某一成员,输出其所有长辈

效果展示

源码 main.cpp
#define _CRT_SECURE_NO_WARNINGS
#include 
#include 

#include"model.h"
#include"menu.h"

int main()
{
    tn* b;

    b = (tn*)malloc(sizeof(tn));

    char s[100];
    printf("请输入括号表达式表示的二叉树结构:");
    gets_s(s);

    b = CreatBTnode(b, s);
    PreOrder(b);
    printf("后序遍历递归算法输出:");
    PostOrder(b);
    printf("n");
    findfather(b);
    return 0;
}
model.h
#pragma once
//创建一个二叉链
typedef struct node
{
    char data;
    struct node* lchild;
    struct node* rchild;
}tn;   //struct node 取一个别名叫tn
menu.h
#pragma once
//构建二叉树
tn* CreatBTnode(tn* b, char s[100]);
//后序递归遍历二叉树
void PostOrder(tn* b);
//先序非递归遍历二叉树
void PreOrder(tn* b);
//查找所有长辈
void findfather(tn* b);
menu.cpp
#define _CRT_SECURE_NO_WARNINGS
#include
#include

#include"model.h"

//构建二叉树
tn* CreatBTnode(tn* b, char s[100])
{
    tn* st[100], * p = NULL;
    int top = -1, j = 0, k = 0;
    b = NULL;

    while (s[j] != '')
    {
        if (s[j] == '(')
        {
            top++;
            st[top] = p;
            k = 1;
        }
        else if (s[j] == ')')
        {
            top--;
        }
        else if (s[j] == ',')
        {
            k = 2;
        }
        else
        {
            p = (tn*)malloc(sizeof(tn));
            p->data = s[j];
            p->rchild = p->lchild = NULL;
            if (b == NULL)
                b = p;
            else if (k == 1)
                st[top]->lchild = p;
            else
                st[top]->rchild = p;
        }
        j++;
    }

    return b;
}

//后序递归遍历二叉树
void PostOrder(tn* b)
{
    if (b != NULL)
    {
        PostOrder(b->lchild);
        PostOrder(b->rchild);
        printf("%c", b->data);
    }
}

//先序非递归遍历二叉树
void PreOrder(tn* b)
{
    printf("先序遍历非递归算法输出:");
    tn* a[100], * p;
    int i = -1;

    if (b != NULL)
    {
        i++;
        a[i] = b;
        while (i > -1)
        {
            p = a[i];
            i--;
            printf("%c", p->data);
            if (p->rchild != NULL)
            {
                i++;
                a[i] = p->rchild;
            }
            if (p->lchild != NULL)
            {
                i++;
                a[i] = p->lchild;
            }
        }
        printf("n");
    }
}

//查找所有长辈
void findfather(tn* b)
{
    printf("请输入指定人物代号,以查询其所有长辈:");
    char c;
    scanf("%c", &c);
    printf("%c的所有长辈为:", c);

    tn* a[100], * p;
    if (b != NULL)
    {
        int i = 0;
        a[i] = b;
        p = b;
        while (p->data != c)
        {
            i++;
            a[i] = p->lchild;
            p = a[i];
            if (p->lchild == NULL && p->data != c)
            {
                printf("您输入的指令有误n");
                break;
            }
        }
        i = i - 1;
        while (i >= 0)
        {
            p = a[i];
            printf("%c", p->data);
            while (p->rchild != NULL)
            {
                p = p->rchild;
                printf("%c", p->data);
            }
            i--;
        }
    }
    printf("n");
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/664414.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号