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

Posted Spring-_-Bear

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[数据结构]基于二叉树的家谱系统相关的知识,希望对你有一定的参考价值。

实验名称

基于二叉树的家谱系统

实验内容

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

实验要求

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

效果展示

源码

main.cpp

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

#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<stdio.h>
#include<stdlib.h>

#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] != '\\0')
    
        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");

以上是关于[数据结构]基于二叉树的家谱系统的主要内容,如果未能解决你的问题,请参考以下文章

二叉树

美国血统

奶牛家谱 Cow Pedigrees

T236450 美国血统

w9-1 美国血统

数据结构树与树的表示二叉树存储结构及其遍历二叉搜索树平衡二叉树堆哈夫曼树与哈夫曼编码集合及其运算