[二叉排序树] 插入相同元素的二叉排序树 | 递归与非递归 | 对结构体中指针的理解

本文主要是介绍[二叉排序树] 插入相同元素的二叉排序树 | 递归与非递归 | 对结构体中指针的理解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

【题目】 设在一棵二叉排序树的每个结点中,含有关键字值key域和统计相同关键字值结点个数的count域
当向该树插入一个元素时
若树中已存在该元素的关键字值相同的结点,则使该结点的count域增1
否则就由该元素生成一个新结点并插入到树中,使其count域+1
【实质】 实现一个可以插入相同元素的二叉排序树-递归与非递归
【讨论】 递归与非递归中指针引用的问题

【结构体定义】

typedef struct BiTNode{int key;int count; //保存元素的个数struct BiTNode *lchild;struct BiTNode *rchild;
}BiTNode, *BiTree;

【对结构体中指针的理解】两种方法中:①递归方法的插入有效;②非递归方法的插入无效,主函数的T还是为NULL。这是为什么?

递归方法非递归方法

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

【问题】非递归能不能像递归那样取到rchild的位置?

【结果】

【完整代码】

#include<stdio.h>
#include<malloc.h>typedef struct BiTNode{int key;int count;struct BiTNode *lchild;struct BiTNode *rchild;
}BiTNode, *BiTree;void insert(BiTNode *&T, int key) {if (!T) {T = (BiTNode *)malloc(sizeof(BiTNode));T->key = key;T->count = 1;T->lchild=T->rchild=NULL;} else {if (T->key == key) ++T->count;else if (T->key < key) insert(T->rchild, key);else insert(T->lchild, key);}
}void insert_norecursion(BiTNode *&T,int key) {// 二叉排序树不需要开辟栈,不需要保存所有路径BiTNode *p = T; //当前指针BiTNode *pre = NULL; //p的父亲// 开始往下搜索while (p) {if (p->key == key) { //找到++p->count; //自增return ;} else { //没有找到,往下查找pre = p; //保留p的父亲if (p->key < key) p=p->rchild;else p=p->lchild;}}// p==NULL表示找到了新元素插入的位置,即为p的位置/* 但直接插入到p无效p = (BiTNode *)malloc(sizeof(BiTNode));p->key = key;p->count = 1;p->lchild=p->rchild=NULL;*/// 插入到p的父亲pre的下面BiTNode *s = (BiTNode *)malloc(sizeof(BiTNode));s->count=1;s->key=key;s->lchild=s->rchild=NULL;if (pre==NULL) //T为空树 T=s; else if (key < pre->key) //挂在pre的左树上pre->lchild = s; elsepre->rchild = s;
}// 按树状打印二叉树:https://geodoer.blog.csdn.net/article/details/82938306
void PrintAsTree(BiTree T, int i) { //i代表所在层次int j;if (T) {PrintAsTree(T->rchild, i+1); //访问右子树for (j=0; j<i-1; ++j) printf("\t");printf("%d(%d)\n",	T->key, T->count);PrintAsTree(T->lchild, i+1); //访问左子树}
}/* 测试数据
13
5 4 3 8 5 9 4 7 8 10 9 6 10
*/
int main() {int n;int key;BiTree T = NULL;// 递归scanf("%d", &n);while (n--) {scanf("%d", &key);insert(T, key);}PrintAsTree(T, 1);BiTree T2 = NULL;scanf("%d", &n);while (n--) {scanf("%d", &key);insert_norecursion(T2, key);}PrintAsTree(T2, 1);return 0;
}

这篇关于[二叉排序树] 插入相同元素的二叉排序树 | 递归与非递归 | 对结构体中指针的理解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/705474

相关文章

Vite 打包目录结构自定义配置小结

《Vite打包目录结构自定义配置小结》在Vite工程开发中,默认打包后的dist目录资源常集中在asset目录下,不利于资源管理,本文基于Rollup配置原理,本文就来介绍一下通过Vite配置自定义... 目录一、实现原理二、具体配置步骤1. 基础配置文件2. 配置说明(1)js 资源分离(2)非 JS 资

深度解析Python中递归下降解析器的原理与实现

《深度解析Python中递归下降解析器的原理与实现》在编译器设计、配置文件处理和数据转换领域,递归下降解析器是最常用且最直观的解析技术,本文将详细介绍递归下降解析器的原理与实现,感兴趣的小伙伴可以跟随... 目录引言:解析器的核心价值一、递归下降解析器基础1.1 核心概念解析1.2 基本架构二、简单算术表达

JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法

《JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法》:本文主要介绍JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法,每种方法结合实例代码给大家介绍的非常... 目录引言:为什么"相等"判断如此重要?方法1:使用some()+includes()(适合小数组)方法2

Java集合中的链表与结构详解

《Java集合中的链表与结构详解》链表是一种物理存储结构上非连续的存储结构,数据元素的逻辑顺序的通过链表中的引用链接次序实现,文章对比ArrayList与LinkedList的结构差异,详细讲解了链表... 目录一、链表概念与结构二、当向单链表的实现2.1 准备工作2.2 初始化链表2.3 打印数据、链表长

MyBatis的xml中字符串类型判空与非字符串类型判空处理方式(最新整理)

《MyBatis的xml中字符串类型判空与非字符串类型判空处理方式(最新整理)》本文给大家介绍MyBatis的xml中字符串类型判空与非字符串类型判空处理方式,本文给大家介绍的非常详细,对大家的学习或... 目录完整 Hutool 写法版本对比优化为什么status变成Long?为什么 price 没事?怎

C++归并排序代码实现示例代码

《C++归并排序代码实现示例代码》归并排序将待排序数组分成两个子数组,分别对这两个子数组进行排序,然后将排序好的子数组合并,得到排序后的数组,:本文主要介绍C++归并排序代码实现的相关资料,需要的... 目录1 算法核心思想2 代码实现3 算法时间复杂度1 算法核心思想归并排序是一种高效的排序方式,需要用

创建springBoot模块没有目录结构的解决方案

《创建springBoot模块没有目录结构的解决方案》2023版IntelliJIDEA创建模块时可能出现目录结构识别错误,导致文件显示异常,解决方法为选择模块后点击确认,重新校准项目结构设置,确保源... 目录创建spChina编程ringBoot模块没有目录结构解决方案总结创建springBoot模块没有目录

深入理解go中interface机制

《深入理解go中interface机制》本文主要介绍了深入理解go中interface机制,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学... 目录前言interface使用类型判断总结前言go的interface是一组method的集合,不

Python lambda函数(匿名函数)、参数类型与递归全解析

《Pythonlambda函数(匿名函数)、参数类型与递归全解析》本文详解Python中lambda匿名函数、灵活参数类型和递归函数三大进阶特性,分别介绍其定义、应用场景及注意事项,助力编写简洁高效... 目录一、lambda 匿名函数:简洁的单行函数1. lambda 的定义与基本用法2. lambda

SpringBoot利用树形结构优化查询速度

《SpringBoot利用树形结构优化查询速度》这篇文章主要为大家详细介绍了SpringBoot利用树形结构优化查询速度,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一个真实的性能灾难传统方案为什么这么慢N+1查询灾难性能测试数据对比核心解决方案:一次查询 + O(n)算法解决