数据结构应用题第五章树代码c

数据结构(C语言第2版) 课后习题答案 详细汇总 数据结构(C语言第2版) 课后习题答案之第一章绪论 数据结构(C语言第2版) 课后习题答案之第二章 线性表 数据结构(C语言第2版) 课后习题答案之 第三章 栈和队列 数据结构(C语言第2版) 课后习题答案之第四章 串、数组和广义表 数据结构(C语言第2版) 课后习题答案之第五章 树和二叉树 数据结构(C语言第2版) 课后习题答案之 第六章 图 数据结构(C语言第2版) 课后习题答案之 第七章 查找 数据结构(C语言第2版) 课后习题答案之 第八章 排序 ... 阅读详情
  • 试给出二叉树的自下而上,自右而左的层次遍历算法
    思路:按照层次遍历的思想正常遍历,但是多使用一个栈来存储层次遍历中出队列的元素,层次遍历结束后把栈中元素全部出栈,出栈的顺序就是题目要求的层次遍历算法。还有一种思路,用一个链表存储层次遍历的结果,然后对链表进行倒置。两种思路都可以。

树定义

#ifndef TREE_H
#define TREE_H

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


// 二叉树的顺序存储结构,适合于完全二叉树和满二叉树
#define MaxSize 100
typedef int ElemType;
typedef char DataType;
typedef struct TreeNode{
    ElemType value;//结点中的数据元素
    bool isEmpty;//结点是否为空
}TreeNode;
// TreeNode t[MaxSize] //初始化长度为MaxSize的数组t
// for(int i=0;i<MaxSize;i++){
//     t[i].isEmpty=true;//初始化标记为空
// }


// 二叉树的链式存储
typedef struct BiTNode{
    DataType data;
    struct BiTNode *lchild,*rchild;
    // struct BiTNode *parent;//用来方便存储父节点指针,这也是所谓的三叉链表
}BiTNode,*BiTree;

void createTree(BiTree *T);//先序创建一棵树 ABD##E##CF##G##
#endif

栈定义和实现

#ifndef LISTACK_H
#define LISTACK_H
#include<stdio.h>
#include<stdbool.h>
#include<stdlib.h>
#include "tree.h"
// 链栈,不带头结点的情况
typedef BiTree TreeType;//入栈的节点是一棵树,不是树的一个节点,否则树会断层
typedef struct LinkNode{
    TreeType data;//数据域
    struct LinkNode *next;
}LinkNode,*LinkStack;

bool InitStack4(LinkStack *s);//初始化不带头结点的栈
bool Push4(LinkStack *s,TreeType x);//入栈
bool Pop4(LinkStack *s,TreeType *x);//出栈
void printfStack4(LinkStack s);//打印
bool EmptyStack4(LinkStack s);//空栈
bool GetTop(LinkStack s,TreeType *x);
#endif
#include "listack.h"


bool InitStack4(LinkStack *s){
    *s=NULL;//栈空,不带头结点
    return true;
}
bool EmptyStack4(LinkStack s){
    if(s==NULL){
        return true;
    }
    return false;
}
// x在这里表示的是一棵树
bool Push4(LinkStack *s,TreeType x){
    LinkNode *p=(LinkNode *)malloc(sizeof(LinkNode));
    if(p==NULL)
        return false;
    p->data=x;
    // 这一步很容易错
    p->next=(*s);
    (*s)=p;
    return true;
}
bool Pop4(LinkStack *s,TreeType *x){
    // printf("Pop-%d",x);
    if((*s)==NULL)//空表
        return false;
    LinkNode *p=*s;
    *s=(*s)->next;
    *x=p->data;
    free(p);

    return true;
}
bool GetTop(LinkStack s,TreeType *x){
   if(s==NULL)
        return false;
    *x=s->data;
    return true;
}
void printfStack4(LinkStack s){
    // s=NULL;
    LinkNode *p=s;
    while(p!=NULL){
        printf("%c->",p->data->data);
        p=p->next;
    }
    printf("\n");
}

队列定义和实现

#ifndef LINKQUEUE_H
#define LINKQUEUE_H
#include<stdio.h>
#include<stdbool.h>
#include<stdlib.h>
#include "listack.h"

// typedef int ElemType;
typedef struct LinkNode2{//链式队列结点
    TreeType data; 
    struct LinkNode2 *next;
}LQNode;
typedef struct{//链式队列
    LQNode *front,*rear;
}LQueue;
// 带头结点的初始化
void InitLQueue_withHead(LQueue *Q);
// 队列为空
bool LQueueEmpty_withHead(LQueue Q);
// 入队
void EnLQueue_withHead(LQueue *Q,TreeType x);
// 出队
bool DeLQueue_withHead(LQueue *Q,TreeType *x);
void printfLQueue_withHead(LQueue Q);
#endif

#include "linkqueue.h"

// 带头结点的初始化
void InitLQueue_withHead(LQueue *Q){
    (*Q).front=(LQNode *)malloc(sizeof(LQNode));
    (*Q).rear=(*Q).front;
    (*Q).front->next=NULL;
}
bool LQueueEmpty_withHead(LQueue Q){
    if(Q.front==Q.rear)
        return true;
    return false;
}
// 入队
void EnLQueue_withHead(LQueue *Q,TreeType x){
    LQNode *s=(LQNode *)malloc(sizeof(LQNode));
    s->data=x;
    s->next=NULL;
    (*Q).rear->next=s;
    (*Q).rear=s;//修改表尾指针
}
// 出队
bool DeLQueue_withHead(LQueue *Q,TreeType *x){
    if((*Q).front==(*Q).rear)//空队
        return false;

    LQNode *p=(*Q).front->next;
    *x=p->data;
    (*Q).front->next=p->next;
    if((*Q).rear==p)//最后一个结点出队
        (*Q).rear=(*Q).front;
    free(p);
    return true;
}
void printfLQueue_withHead(LQueue Q){
    if(Q.front==Q.rear)
        return;

    LQNode *p=Q.front->next;
    while(p!=NULL){
        printf("%d<-",p->data);
        p=p->next;
    }
    printf("\n");
}

倒置层次遍历实现

#include "tree.h"
#include "listack.h"
#include "linkqueue.h"
// create——ABD##E##CF##G##
void createTree(BiTree *T){
    DataType ch;
    scanf("%c",&ch);
    // while(getchar()!='\n');//当获取一个有效字符时结束循环
    if(ch=='#'){
        *T=NULL;
        return;
    }
    else{
        *T=(BiTNode *)malloc(sizeof(BiTNode));
        (*T)->data=ch;
        createTree(&((*T)->lchild));
        createTree(&((*T)->rchild));
    }
}
void level(BiTree T){
    // 创建并初始化一个栈
    LinkStack L;
    InitStack4(&L);

    // 创建并初始化一个队列
    LQueue Q;
    InitLQueue_withHead(&Q);
    BiTNode* temp=NULL;//用来存储出队列的元素
    //层次遍历
    EnLQueue_withHead(&Q,T);
    Push4(&L,T);
    while(!LQueueEmpty_withHead(Q)){//如果队列不为空
        DeLQueue_withHead(&Q,&temp);
        if(temp->lchild!=NULL){
            EnLQueue_withHead(&Q,temp->lchild);
            Push4(&L,temp->lchild);
        }
        if(temp->rchild!=NULL){
            EnLQueue_withHead(&Q,temp->rchild);
            Push4(&L,temp->rchild);
        }
    }
    // while()
    printfStack4(L);
}
void test4(){
    BiTree T;
    printf("请连续输入字符,中间不要有空格和换行。。。\n");
    createTree(&T);
    level(T);
}

实现截图
在这里插入图片描述

  • 假设二叉树采用二叉链表的存储结构,设计一个非递归算法求二叉树的高度
    思路和二叉树的先序遍历的非递归实现一样。只是这里把输出改为对高度的的++和- -。
// 利用栈来实现先序遍历的非递归算法
int PreOrder(BiTree T){
    LinkStack S;
    InitStack4(&S);

    BiTNode *p=T;
    int length=0;//高度
    int temp=0;//临时变量
    while(p!=NULL||!EmptyStack4(S)){
        if(p!=NULL){
            // printf("%c",p->data);
            temp++;
            Push4(&S,p);
            p=p->lchild;
        }else{//说明左子树已经遍历完成
            Pop4(&S,&p);
            length=length>=temp?length:temp;
            temp--;//这里把结点出栈,所以这里的temp要--
            p=p->rchild;
        }
    }
    return length;
    printf("\n");
}
  • 编程求以孩子兄弟表示法存储的森林的叶子结点数
    思路:首先用孩子兄弟表示法存储的森林是以二叉树的存储方式保存的,其左子树代表当前结点的第一个孩子结点,右子树代表当前结点的右兄弟,如果右兄弟还有右兄弟(同一层),那么其右兄弟的右兄弟存储在右兄弟的右子树上,以此类推。以此为思路,当左孩子为空说明是叶子节点,把叶子节点的数量 1 加上右兄弟的数量,就是森林的叶子结点的数量。实现如下:
#ifndef TREEPLUS_H
#define TREEPLUS_H
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>

typedef char ElemType;
// 孩子兄弟表示法(链式存储)——树和二叉树相互转化的问题
typedef struct CSNode{
    ElemType data;
    struct CSNode *firstchild,*nextsibling;//第一个孩子和右兄弟指针
}CSNode,*CSTree;

void createTreeplus(CSTree *T);//创建一棵树
#endif
#include "treeplus.h"

// create——ABD##E##CF##G##
void createTreeplus(CSTree *T){
    ElemType ch;
    scanf("%c",&ch);
    // while(getchar()!='\n');//当获取一个有效字符时结束循环
    if(ch=='#'){
        *T=NULL;
        return;
    }
    else{
        *T=(CSNode *)malloc(sizeof(CSNode));
        (*T)->data=ch;
        createTreeplus(&((*T)->firstchild));
        createTreeplus(&((*T)->nextsibling));
    }
}
#include "treeplus.h"

int leaves_num(CSTree T){
    if(T==NULL)
        return 0;
    if(T->firstchild==NULL)//表示一定是叶子节点
        return 1+leaves_num(T->nextsibling);//返回叶子结点数目以及它兄弟的数量
    else
        return leaves_num(T->firstchild)+leaves_num(T->nextsibling);//返回孩子子树和兄弟子树叶子数之和
}

int test5_167(){
    CSTree T;
    createTreeplus(&T);
    printf("%d\n",leaves_num(T));
}

void main(){
    printf("请输入一棵树。。。\n");
    test5_167();
}
  • 以孩子兄弟链表为存储结构,请设计递归算法求树的深度
    思路:和二叉树求树高差不多
#include "treeplus.h"
// create——ABD##E###

int height(CSTree T){
    if(T==NULL)
        return 0;
    int hc=0,hs=0;
    hc=height(T->firstchild)+1;//第一个子女的树高,所以后面要加1
    hs=height(T->nextsibling);//兄弟结点的树高,同一层,所以不用+1
    if(hc>hs)
        return hc;
    else
        return hs;
}
void test6_167(){
    CSTree T;
    createTreeplus(&T);
    printf("%d\n",height(T));
}
数据结构(C语言第2版) 课后习题答案之第五章 树和二叉树 目录 第5章 树和二叉树 一、选择题 二、应用题 (1)试找出满足下列条件的二叉树 (2)设一棵二叉树的先序序列: A B D F C E G H ,中序序列: B F D A G E H C (3) 假设用于通信的电文仅由8个字母组成,字母在电文中出现的频率分别为0.07,0.19,0.02,0.06,0.32,0.03,0.21,0.10。 (4)已知下列字符A、B、C、D、E、F、G的权值分别为3、12、7、4、2、8,11,试填写出其对应哈夫曼树HT的存储结构的初态和终态。 ... 阅读详情

相关推荐

【考研】数据结构常考应用典型例题(含真题)

本文针对《数据结构》,博主花了几天时间列出了考研常考的应用题型,讲解详细,方便复习。各类题型所涉及的知识点包括但不限于队列、二叉排序树、平衡二叉树、哈夫曼树及哈夫曼编码、图的存储、最小生成树、关键路径、排序算法等等。(标题即为考点)。例题出自408真题,以及各高校的自主命题(含王道解析)。(后期会继续补充题目)目录前言一、队列二、树(一)二叉排序树(二)平衡二叉树(三)森林与二叉树的转换(四)哈夫曼树及哈夫曼编码三、图(一)邻接表及邻接矩阵、最小生成树(二)DFS和BFS(图的遍历)

qq_34438969的博客 3万+

考研408 王道 数据结构 应用题整理(二)树的应用

考研408 王道 数据结构 应用题整理(二)树的应用

nabobess的博客 967

数据结构-树的一些练习题

包含数据结构考试以及面试的一些题目,供读者进行练习

数据结构—树的应用

数据结构—树的应用

Voltline的博客 1520

一文了解ECU软件刷写的2种方法:Bootloader刷写和调试器刷写

分为刷写前、刷写中和刷写后三个阶段,如下示意:下面我们来详细了解一下Bootloader收到外部请求后开始刷写的三个阶段1)刷写前进行刷写的准备,一是确保刷写阶段总线通信的稳定性,二是避免刷写阶段出现非预期的故障,三是读取车辆数据供刷写前的一些检查等,如下所示:首先进行会话控制,通过功能寻址方式进入扩展会话模式,为后面的信息访问及其他指令做准备;然后检查刷写的前提条件,通过物理寻址方式发送历程控制请求。比如车确实处于静止状态,供电电压稳定等条件下才允许刷写;

menghuyouyou的博客 5790

DolphinScheduler任务状态异常排查:从僵尸任务到数据库修复全流程

本文详细介绍了DolphinScheduler中僵尸任务的识别、诊断与修复全流程,包括数据库层面的SQL操作指南、系统恢复验证方法以及预防措施。针对任务状态异常问题,提供了从基础排查到高级源码分析的完整解决方案,帮助运维人员有效管理系统资源和工作流调度。

weixin_27966471的博客 133

数据结构树题库

《数据结构树之切腹攻略》 目录 华文课后题 王道课后题 华文课后题 1、给出一棵树的逻辑结构T=(N,R),其中: N={A,B,C,D,E,F,G,H,I,J,K} R={r} r={(A,B),(B,E),(B,F),(F,G),(F,H),(A,C),(C,I),(C,J),(J,K),(A,D)} 试回答下列问题: (1)哪个是F的父结点? (2)哪些是B的子孙?...

闲狗的博客 6190

手把手教你用HiNet实现图像隐藏:可逆神经网络实战指南(附代码)

本文提供了一份基于HiNet框架实现图像隐藏的实战指南。通过详细解析可逆神经网络原理,手把手指导环境搭建、模型构建、损失函数设计及训练流程,并附有完整代码。该方法利用单个可逆网络统一隐藏与恢复过程,结合小波变换提升隐蔽性,为信息隐藏应用提供了高效解决方案。

rgv234567的博客 434

《数据结构》-第五章 树和二叉树(习题)

第五章 树与二叉树练习题 本章的树作为一类重要的一对多的数据结构的代表,在现实生活中很多关系都可以用树形结构表示,其中二叉树更是最常出现的一种表现方式。因此,涉及相关概念较多,同时二叉树的5大性质更是常考点。哈夫曼树作为最优二叉树常在综合应用题中出现,要充分了解构造过程。 在考试过程中,会涉及选择题(几率大)、填空题、综合应用题和算法题各方面,同时所占分值较大,要对本章内容重点把握。 一、选择题 1. 把一棵树转换为二叉树后,这棵二叉树的形态是( )。 A....

大家一起进步叭 1万+

2025软考信息安全工程师真题

2025信息安全工程师软考真题

qq_40424393的博客 1710

用Linkboy玩转Arduino:3小时搞定智能倒车雷达(附仿真文件下载)

本文详细介绍了如何利用Linkboy图形化编程工具,在3小时内快速搭建一个基于Arduino的智能倒车雷达项目。通过仿真环境,初学者无需硬件即可学习超声波测距原理、报警逻辑设计,并完成从虚拟仿真到实体硬件的完整流程。文章提供了清晰的步骤、调试技巧及功能扩展思路,并附有仿真文件,是入门Arduino和智能硬件制作的绝佳实践指南。

weixin_29159441的博客 405

408数据结构第五章 树与二叉树

本章内容较多,讲解了树、森林、并查集等多种数据结构及其操作原理与代码实现

m0_74983085的博客 2474

性能优化-高通cDSP(QDSP6)架构详解

高通cDSP开发的商业价值30秒快速认识高通cDSP开发的商业价值【高通cDSP旨在处理一些简单但需要大量计算的场景,如图像处理、科学计算、AI训练、计算机视觉等。这些场景使用CPU来运算会极大的降低CPU的吞吐量,因此利用现代寄存器较宽的特性设计出了适配数据并行的DSP芯片,cDSP就是典型的代表。利用cDSP+CPU既可以满足一般的使用场景,也可以完成现代图像和视频数据的处理。

发狂的小花的博客 5947

数据结构(C语言)第二版 第五章课后答案

数据结构(C语言)第二版 第五章课后答案 1.选择题 ( 1)把一棵树转换为二叉树后,这棵二叉树的形态是() 。 A.唯一的B.有多种 C.有多种,但根结点都没有左孩子D.有多种,但根结点都没有右孩子 答案: A 解释:因为二叉树有左孩子、右孩子之分,故一棵树转换为二叉树后,这棵二叉树的 形态是唯一的。 ( 2)由3 个结点可以构造出多少种不同的二叉树?() A. 2 B . 3 C . 4 D ...

博客 3万+

SAP资产模块(FI-AA)与总账(FI-GL)数据不一致是财务顾问和会计人员最常遇到的棘手问题之一

SAP资产模块(FI-AA)与总账(FI-GL)数据不一致问题主要源于四大原因:1)违规手工记账(最常见),直接通过总账录入资产科目凭证而未通过资产模块;2)折旧运行问题,包括执行失败、跨年度问题或配置冲突;3)主数据与配置错误,如科目确定或折旧键设置不当;4)业务流程遗漏,如单据未生成凭证或汇率差异。解决方案包括运行对账报表、检查凭证来源、补跑折旧及核对配置。关键预防措施是坚持"资产模块发起→自动生成凭证→总账审核"的标准流程。

金牌架构师 428

c#算法(5)—最小二乘法(二次曲线拟合)

最小二乘法——二次曲线拟合

qq_34059233的博客 1659

从零开始学数据结构系列之第五章《B树的代码部分》

以上就是所有内容,对大家有用的话点个关注!​ B树的插入操作只能在。

铁匠匠匠的博客 1422

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

第五章 树和二叉树——课后习题解练【数据结构(c语言版 第2版)】

答案:A。

naozibuok的博客 523

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

从零开始学数据结构系列之第五章《B树的总体代码》

以上就是所有内容,对大家有用的话点个关注!

铁匠匠匠的博客 1199

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

用C/C++构建自己的Redis——第五章、Redis中的AVL树实现

在Redis数据库中,有序集合是一种核心的数据结构,它允许存储具有关联分数的唯一元素。为了实现这种数据结构,Redis采用了AVL树,一种自平衡的二叉搜索树,以确保数据的快速插入、删除和查找操作。这一章我们将一起深入探讨AVL树在Redis有序集合中的应用,包括其节点定义、插入和删除操作、以及如何通过旋转操作保持树的平衡。此外,文章还将介绍如何通过一系列测试案例来验证AVL树的正确性和性能,确保其在实际应用中的可靠性。

m0_46295679的博客 1417

数据结构(C语言版)第五章树和二叉树

数据结构(C语言版)第五章树和二叉树

2301_76828807的博客 1668

数据结构第五章:树与二叉树知识总结

在数据结构的学习中,第五章主要围绕树相关的内容展开,其知识密度和难度都有进一步提升。

m0_57836225的博客 881

数据结构—第五章 树与二叉树

本文系统介绍了树与二叉树的基本概念、存储结构、遍历方法及应用。主要内容包括:1)树的基本术语和二叉树定义,包括满二叉树、完全二叉树等特殊类型;2)二叉树的顺序/链式存储及先序、中序、后序和层次遍历算法;3)线索二叉树的构造与遍历;4)树和森林的存储结构、转换方法及遍历方式;5)哈夫曼树与编码的原理及应用;6)并查集的实现与优化;7)堆的定义与特性。通过代码示例和性质分析,全面阐述了树形结构的核心知识点与实际应用场景。

weixin_45419526的博客 1233

【最详细】数据结构(C语言版 第2版)第五章课后习题答案 严蔚敏 等 编著

1.选择题 ( 1)把一棵树转换为二叉树后,这棵二叉树的形态是() 。 A.唯一的 B.有多种 C.有多种,但根结点都没有左孩子 D.有多种,但根结点都没有右孩子 答案: A 解释:因为二叉树有左孩子、右孩子之分,故一棵树转换为二叉树后,这棵二叉树的 形态是唯一的。 ( 2)由 3 个结点可以构造出多少种不同的二叉树?() A. 2 B . 3 C . 4 D . 5 答案: D ( 3)一棵完全二叉树上有 1001 个结点,其中叶子结点的个数是() 。 A. 250 B . 500 C . 254 D .

weixin_43899069的博客 7万+

25版王道数据结构课后习题详细分析 第五章树与二叉树 5.4树、森林

给定一棵树的先根遍历序列和后根遍历序列,能否唯一确定一棵树?若能,请举例说明将下面一个由3棵树组成的森林转换为二叉树。 已知某二叉树的先序序列和中序序列分别为 ABDEHCFIMGJKL和 DBHEAIM FCGKLJ, 请画出这棵二叉树,并画出二叉树对应的森林。 编程求以孩子兄弟表示法存储的森林的叶结点数。 以孩子兄弟链表为存储结构,请设计递归算法求树的深度。下列关于树的说法中,正确的是利用二叉链表存储森林时,根结点的右指针是

2406_86301373的博客 1203

算法与数据结构复习 第五章 树及二叉树(详解)

文章目录第五章 树及二叉树书面作业一、判断题二、单选题三、填空题 第五章 树及二叉树 书面作业 一、判断题 1、某二叉树的前序和中序遍历序列正好一样,则该二叉树中的任何结点一定都无左孩子。 (T) 解析: 二叉树的前序是先根再左再右,中序是先左再根再右;若相同,则没有左; 2、若一个结点是某二叉树的中序遍历序列的最后一个结点,则它必是该树的前序遍历序列中的最后一个结点。(F) 解析: 中序遍历序列...

好学者的博客 1万+
上一篇: 数据结构第五章树部分代码c
下一篇: 数据结构第六章图部分知识点
@@老胡
博客等级 码龄7年 291粉丝 184原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值