C语言根据层次输入创建二叉树

2023-10-27

思想:

用一个数组接收层次输入(下标0不存储信息),看图可以发现父节点的左子树是自身下标乘以二,右子树是自身下标乘以二再加一。

A的下标是1,下标乘以二是左子树B的下标,下标乘以二再加一是有子树C的下标。

如果左子树或者右子树的下标对应的字符为‘*’,则当前为NULL,没有子树。

如果当前下标左子树下标大于数组长度(自身下标*2>数组长度),则当前没有左子树(为NULL)。

如果当前下标右子树下标大于数组长度(自身下标*2+1>数组长度),则当前没有右子树(为NULL)。

 

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

// 创建树的数据类型
typedef struct Node {
    char val;
    struct Node* leftChild = NULL;
    struct Node* rightChild = NULL;
} Tree, * BiTree;

void preVisit(BiTree T);  // 先序遍历 
void midVisit(BiTree T);  // 中序遍历
void postVistit(BiTree T);// 后序遍历
void createTree(BiTree& T, int index);  // 用层次输入的数据。创建二叉树 
void inputData(BiTree& T);              // 输入树的层次遍历 

int main(void) {
    BiTree T;
    inputData(T);
    printf("\n先序:");
    preVisit(T);
    printf("\n中序:");
    midVisit(T);
    printf("\n后序:");
    postVistit(T);
}


char str[100];
int num = 1;
void createTree(BiTree& T, int index) {
    if (str[index] == '*') {
        T = NULL;
        return;
    }
    T = (BiTree)malloc(sizeof(Tree));
    T->val = str[index];
    T->leftChild = NULL;
    T->rightChild = NULL;
    if (index * 2 <= num) {
        createTree(T->leftChild, index * 2);
    }
    if (index * 2 + 1 <= num) {
        createTree(T->rightChild, index * 2 + 1);
    }
}
void inputData(BiTree& T) {
    char ch;
    while (1) {
        scanf("%c", &ch);
        if (ch == '@')
            break;
        str[num++] = ch;
    }
    num--;
    createTree(T, 1);
}

void preVisit(BiTree T) {
    if (T) {
        printf("%c", T->val);
        preVisit(T->leftChild);
        preVisit(T->rightChild);
    }
}
// 中序遍历
void midVisit(BiTree T) {
    if (T) {
        midVisit(T->leftChild);
        printf("%c", T->val);
        midVisit(T->rightChild);

    }
}
// 后序遍历
void postVistit(BiTree T) {
    if (T) {
        postVistit(T->leftChild);
        postVistit(T->rightChild);
        printf("%c", T->val);
    }
}

输入:abd*c*e@

输出如图:

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C语言根据层次输入创建二叉树 的相关文章

  • CentOS7.2下SSL证书的配置

    HTTPS的配置 2017 07 28 准备 假设CentOS7 已经安装了Apache Web服务器 yum install mod ssl openssl 安装完毕后 会自动生成 etc httpd conf d ssl conf 文件

随机推荐

  • CSS Tricks各种动画效果

    CSS Tricks各种动画效果
  • MySQL的体系结构

    MySQL是由SQL接口 解析器 优化器 缓存 存储引擎组成的 MySQL体系结构可以分为四个层级 如图1所示 一 连接层 思想 为解决资源的频繁分配 释放所造成的的问题 为数据库连接建立一个 缓冲池 原理 预先在缓冲池中放入一定数量的连接
  • IP地址定位原理

    IP地址定位是一种通过IP地址来确定位置的技术 在互联网和移动网络的应用十分广泛 本文将介绍IP地址定位的原理和实现方式 IP地址定位原理 IP地址是Internet Protocol 简称IP 的缩写 是互联网上的一个地址标识符用于识别连
  • 面板phpMyAdmin不同版本和MySQL还有php版本的对应情况

    phpMyAdmin4 9 0 Current version compatible with PHP 5 5 to 7 3 and MySQL 5 5 and newer phpMyAdmin4 8 0 Older version com
  • matlab绘图legend遮挡曲线,matlab绘图中legend的终极用法

    持续更新 当前 20100108 仅作笔记 作者 keyflying legend有时候挺烦人的 尽管大多时候挺好用 基本数据 data rand 25 repmat 1 25 25 1 H plot data 基本用法 legend st
  • 手动编辑一个快捷卸载的bat文件

    1 首先建立一个空的XXX bat文件 2 编辑内容输入 echo off goto run run start control appwiz cpl 3 保存 实现效果打开后直接跳转卸载界面 方便快速操作卸载文件
  • Java学习笔记 面向对象(下)

    第六章 面向对象 下 1 this与super 2 构造方法的多态 3 抽象类 4 接口 interface 5 引用 6 类的其他相关内容 1 this与super this this 域变量和this 成员方法 明确表示用的是类的域变量
  • iOS进阶_密码学(四.抽取登录网络请求的单例)

    登录业务逻辑完善 在网络开发中 一般会有一个单例负责所有的网络请求 将这个网络登录的部分代码抽取出来 新建一个 类 复制方法 调整参数 测试登录能否成功运行 WTNetworkTools h import
  • pygame捕获键盘事件的两种方式

    pygame捕获键盘事件的两种方式 方式1 在pygame中使用pygame event get 方法捕获键盘事件 使用这个方式捕获的键盘事件必须要是按下再弹起才算一次 示例示例 eventList pygame event get 2 对
  • Kaggle冠军告诉你,如何从卫星图像分割及识别比赛中胜出?

    本文来自AI新媒体量子位 QbitAI 在2016年12月至2017年3月期间 Kaggle网站举办了一场对英国国防科学与技术实验室 DSTL 提供的卫星图像进行场景特征检测的图像分割比赛 主办方所提供的训练集里包含了25个1平方公里大小地
  • Hystrix熔断器整合 - 搭建项目

    实战前需了解 https blog csdn net wanzijy article details 125041622 Hystrix熔断器整合 搭建项目 https blog csdn net wanzijy article detai
  • 【华为OD统一考试B卷

    华为OD统一考试A卷 B卷 新题库说明 2023年5月份 华为官方已经将的 2022 0223Q 1 2 3 4 统一修改为OD统一考试 A卷 和OD统一考试 B卷 你收到的链接上面会标注A卷还是B卷 请注意 根据反馈 目前大部分收到的都是
  • 2022华为杯A题思路分析移动场景超分辨定位问题

    华为杯A题专业性非常强 也成为华为题 对于不是通信和雷达专业的同学来说不太友好 谨慎选择 时间紧不利于对于公式的理解 移动场景超分辨定位问题 这是一个在移动场景下进行信号波定位问题 首先我们需要了解以下调频连续波雷达FMCW 这是它的基本结
  • Android酷炫实用的开源框架(UI框架)

    Android酷炫实用的开源框架 UI框架 前言 忙碌的工作终于可以停息一段时间了 最近突然有一个想法 就是自己写一个app 所以找了一些合适开源控件 这样更加省时 再此分享给大家 希望能对大家有帮助 此博文介绍的都是UI上面的框架 接下来
  • 基于深度学习的图像重照明实践学习笔记(2)

    基于深度学习的图像重照明实践学习笔记 2 项目摘要 项目任务是什么 解决这个任务的基本模型架构是怎样的 使用什么数据训练模型 模型如何设计 冠军模型 Wavelet Decomposed RelightNet WDRN 经典模型 Norm
  • 【C++从入门到放弃】C++编译生成动态链接库*.so及如何调用*.so进阶篇-编译jsoncpp

    cstudy5中 我们演示了自己的写的源码进行编译成链接库 本章将讲解编译开源的jsoncpp 备注 上面提到的cstudy5示例参见 https blog csdn net hl java article details 90812168
  • ERROR: Could not find a version that satisfies the requirement notebook (from versions: none) 解决办法

    1 提示如下错误 ERROR Could not find a version that satisfies the requirement notebook from versions none ERROR No matching dis
  • 视锥体裁剪射线的算法

    射线Ray 直线情况 需要满足的条件 在视野中显示的粗细均匀 需要分段绘制 每段的粗细根据到视野的距离计算 射线model的顶点尽量少以节省性能损耗 要满足条件2的话需要对射线进行裁剪 只绘制射线在视锥体内的部分 因此需要计算射线被视锥体裁
  • pycharm用不了anaconda的库

    pycharm用不了anaconda的库 电脑安装了anaconda之后 运行含有一些库的代码没有出现错误 但是用pycharm运行之后出现了错误 报错为no module named numpy 解决方法如下 1 打开pycharm软件
  • C语言根据层次输入创建二叉树

    思想 用一个数组接收层次输入 下标0不存储信息 看图可以发现父节点的左子树是自身下标乘以二 右子树是自身下标乘以二再加一 A的下标是1 下标乘以二是左子树B的下标 下标乘以二再加一是有子树C的下标 如果左子树或者右子树的下标对应的字符为 则