递归算法设计技术

简介: 实验目的实验内容实验过程程序清单复杂度分析运行结果

实验目的

通过本次实验,掌握二叉树递归处理算法,并会分析该算法的时间复杂度。


实验内容

删除二叉树的子树:假设二叉树中的结点均不相等,采用二叉链存储,设计递归算法删除根结点值为x的子树。


实验过程


1.算法设计

1.首先递归创建一颗二叉树


根据输入的节点值创建二叉树根据用户输入的节点值(#表示空节点),使用递归的方式创建二叉树。


2.查找要删除的子树的根节点


输入要删除的子树的根节点的值,程序在二叉树中查找值为该值的节点,并返回该节点的指针。


3.递归删除子树


对于当前节点,依次递归删除其左子树和右子树中值为子树根节点值的子树。如果当前节点为空或者当前节点的值不等于子树根节点的值,则直接返回当前节点的指针。如果当前节点的左子树或右子树中存在值为子树根节点的节点,则将该节点的左子树或右子树置为空,并释放该节点的空间。


4.输出删除子树后的二叉树


使用中序遍历的方式遍历二叉树,输出删除子树后的节点值序列。


5.输出删除成功,结束程序


程序清单

#include <stdio.h>
#include <stdlib.h>
#define TYPE char
struct biTree {
    TYPE data;
    struct biTree *lchild;
    struct biTree *rchild;
};
/**
 * 释放节点T函数
 * @param T
 */
void del(struct biTree *T) {
    if (T) {
        if (T->lchild)del(T->lchild);
        if (T->rchild)del(T->rchild);
        free(T);
    }
}
/**
    这里设置一个父结点指针
    因为free只会释放所在结点里面的内容
    并不会置空
 **/
void delXsub(struct biTree *T, int x) {
    struct biTree *p = T;
    if (p->lchild && p->lchild->data == x) {
        del(p->lchild);
        p->lchild = NULL;
    }
    if (p->rchild && p->rchild->data == x) {
        del(p->rchild);
        p->rchild = NULL;
    }
    if (p->lchild)delXsub(p->lchild, x);
    if (p->rchild)delXsub(p->rchild, x);
}
/**
 * 递归先序遍历创建二叉树,返回二叉树
 * @param T
 * @return
 */
struct biTree *create(struct biTree *T) {
    TYPE data;//当前结点
    printf("data=");
    scanf("%c", &data);
    getchar();
    if (data != '#') {
        T = (struct biTree *) malloc(sizeof(struct biTree *));
        T->data = data;
        T->lchild = NULL;
        T->rchild = NULL;
        T->lchild = create(T->lchild);
        T->rchild = create(T->rchild);
    }
    return T;
}
/**
 * 中序遍历二叉树
 * @param T 
 */
void inOrder(struct biTree *T) {
    if (T != NULL) {
        inOrder(T->lchild);
        printf("%c", T->data);
        inOrder(T->rchild);
    }
}
 int main() {
    char x;
    struct biTree *T = (struct biTree *) malloc(sizeof(struct biTree));
     //创建一棵二叉树
    T = create(T);
    printf("中序遍历结果为:\n");
    inOrder(T);
    //换行
    printf("\n");
    printf("请输入您要删除的x的值:x=");
    scanf("%c", &x);
    printf("删除后中序遍历结果为:\n");
    if (T->data == x) {
        //调用函数删除
        del(T);
    } else {
        //再次查找
        delXsub(T, x);
    }
    inOrder(T);
    printf("删除结点及其子树成功!");
    return true;
}


复杂度分析

(1)时间复杂度

O(n)

(2)空间复杂度

O(log2n)


运行结果

结果一


33.png


结果二:

34.png






相关文章
|
18天前
|
机器学习/深度学习 人工智能 算法
【眼疾病识别】图像识别+深度学习技术+人工智能+卷积神经网络算法+计算机课设+Python+TensorFlow
眼疾识别系统,使用Python作为主要编程语言进行开发,基于深度学习等技术使用TensorFlow搭建ResNet50卷积神经网络算法,通过对眼疾图片4种数据集进行训练('白内障', '糖尿病性视网膜病变', '青光眼', '正常'),最终得到一个识别精确度较高的模型。然后使用Django框架开发Web网页端可视化操作界面,实现用户上传一张眼疾图片识别其名称。
52 9
【眼疾病识别】图像识别+深度学习技术+人工智能+卷积神经网络算法+计算机课设+Python+TensorFlow
|
1天前
|
机器学习/深度学习 自然语言处理 负载均衡
揭秘混合专家(MoE)模型的神秘面纱:算法、系统和应用三大视角全面解析,带你领略深度学习领域的前沿技术!
【8月更文挑战第19天】在深度学习领域,混合专家(Mixture of Experts, MoE)模型通过整合多个小型专家网络的输出以实现高性能。从算法视角,MoE利用门控网络分配输入至专家网络,并通过组合机制集成输出。系统视角下,MoE需考虑并行化、通信开销及负载均衡等优化策略。在应用层面,MoE已成功应用于Google的BERT模型、Facebook的推荐系统及Microsoft的语音识别系统等多个场景。这是一种强有力的工具,能够解决复杂问题并提升效率。
|
6天前
|
机器学习/深度学习 监控 算法
目标检测算法技术
8月更文挑战第11天
|
5天前
|
机器学习/深度学习 算法 Java
算法设计(动态规划应用实验报告)实现基于贪婪技术思想的Prim算法、Dijkstra算法
这篇文章介绍了基于贪婪技术思想的Prim算法和Dijkstra算法,包括它们的伪代码描述、Java源代码实现、时间效率分析,并展示了算法的测试用例结果,使读者对贪婪技术及其应用有了更深入的理解。
算法设计(动态规划应用实验报告)实现基于贪婪技术思想的Prim算法、Dijkstra算法
|
10天前
|
机器学习/深度学习 数据采集 人工智能
理解并应用机器学习算法:从技术基础到实践应用
【8月更文挑战第10天】机器学习算法的应用已经深入到我们生活的方方面面,理解和掌握机器学习算法对于数据科学家、工程师乃至普通从业者来说都至关重要。通过本文的介绍,希望大家能够对机器学习有一个基本的认识,并学会如何将其应用于实际问题中。当然,机器学习是一个不断发展和演变的领域,只有不断学习和实践,才能跟上时代的步伐。
|
20天前
|
机器学习/深度学习 数据采集 人工智能
AI技术实践:利用机器学习算法预测房价
人工智能(Artificial Intelligence, AI)已经深刻地影响了我们的生活,从智能助手到自动驾驶,AI的应用无处不在。然而,AI不仅仅是一个理论概念,它的实际应用和技术实现同样重要。本文将通过详细的技术实践,带领读者从理论走向实践,详细介绍AI项目的实现过程,包括数据准备、模型选择、训练和优化等环节。
118 3
|
24天前
|
机器学习/深度学习 自然语言处理 算法
AIGC技术的核心算法与发展趋势
【7月更文第27天】随着人工智能技术的迅速发展,AIGC技术已经逐渐成为内容创造领域的一个重要组成部分。这些技术不仅能够帮助人们提高工作效率,还能创造出以往难以想象的新颖内容。本文将重点介绍几种核心算法,并通过一个简单的代码示例来展示如何使用这些算法。
34 7
|
1月前
|
算法
共识协议的技术变迁问题之Raft的选举算法进行如何解决
共识协议的技术变迁问题之Raft的选举算法进行如何解决
|
1月前
|
算法 安全 搜索推荐
AES(Advanced Encryption Standard)是一种广泛使用的对称密钥加密算法,由美国国家标准技术研究所(NIST)制定。
AES(Advanced Encryption Standard)是一种广泛使用的对称密钥加密算法,由美国国家标准技术研究所(NIST)制定。
|
2月前
|
存储 算法 Java
技术笔记:JVM的垃圾回收机制总结(垃圾收集、回收算法、垃圾回收器)
技术笔记:JVM的垃圾回收机制总结(垃圾收集、回收算法、垃圾回收器)
32 1