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

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

【题目】 设在一棵二叉排序树的每个结点中,含有关键字值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

相关文章

go 指针接收者和值接收者的区别小结

《go指针接收者和值接收者的区别小结》在Go语言中,值接收者和指针接收者是方法定义中的两种接收者类型,本文主要介绍了go指针接收者和值接收者的区别小结,文中通过示例代码介绍的非常详细,需要的朋友们下... 目录go 指针接收者和值接收者的区别易错点辨析go 指针接收者和值接收者的区别指针接收者和值接收者的

深入理解Apache Kafka(分布式流处理平台)

《深入理解ApacheKafka(分布式流处理平台)》ApacheKafka作为现代分布式系统中的核心中间件,为构建高吞吐量、低延迟的数据管道提供了强大支持,本文将深入探讨Kafka的核心概念、架构... 目录引言一、Apache Kafka概述1.1 什么是Kafka?1.2 Kafka的核心概念二、Ka

如何高效移除C++关联容器中的元素

《如何高效移除C++关联容器中的元素》关联容器和顺序容器有着很大不同,关联容器中的元素是按照关键字来保存和访问的,而顺序容器中的元素是按它们在容器中的位置来顺序保存和访问的,本文介绍了如何高效移除C+... 目录一、简介二、移除给定位置的元素三、移除与特定键值等价的元素四、移除满足特android定条件的元

Java Optional避免空指针异常的实现

《JavaOptional避免空指针异常的实现》空指针异常一直是困扰开发者的常见问题之一,本文主要介绍了JavaOptional避免空指针异常的实现,帮助开发者编写更健壮、可读性更高的代码,减少因... 目录一、Optional 概述二、Optional 的创建三、Optional 的常用方法四、Optio

C语言函数递归实际应用举例详解

《C语言函数递归实际应用举例详解》程序调用自身的编程技巧称为递归,递归做为一种算法在程序设计语言中广泛应用,:本文主要介绍C语言函数递归实际应用举例的相关资料,文中通过代码介绍的非常详细,需要的朋... 目录前言一、递归的概念与思想二、递归的限制条件 三、递归的实际应用举例(一)求 n 的阶乘(二)顺序打印

Mybatis 传参与排序模糊查询功能实现

《Mybatis传参与排序模糊查询功能实现》:本文主要介绍Mybatis传参与排序模糊查询功能实现,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧... 目录一、#{ }和${ }传参的区别二、排序三、like查询四、数据库连接池五、mysql 开发企业规范一、#{ }和${ }传参的

MySQL INSERT语句实现当记录不存在时插入的几种方法

《MySQLINSERT语句实现当记录不存在时插入的几种方法》MySQL的INSERT语句是用于向数据库表中插入新记录的关键命令,下面:本文主要介绍MySQLINSERT语句实现当记录不存在时... 目录使用 INSERT IGNORE使用 ON DUPLICATE KEY UPDATE使用 REPLACE

使用Java实现通用树形结构构建工具类

《使用Java实现通用树形结构构建工具类》这篇文章主要为大家详细介绍了如何使用Java实现通用树形结构构建工具类,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录完整代码一、设计思想与核心功能二、核心实现原理1. 数据结构准备阶段2. 循环依赖检测算法3. 树形结构构建4. 搜索子

利用Python开发Markdown表格结构转换为Excel工具

《利用Python开发Markdown表格结构转换为Excel工具》在数据管理和文档编写过程中,我们经常使用Markdown来记录表格数据,但它没有Excel使用方便,所以本文将使用Python编写一... 目录1.完整代码2. 项目概述3. 代码解析3.1 依赖库3.2 GUI 设计3.3 解析 Mark

C++从序列容器中删除元素的四种方法

《C++从序列容器中删除元素的四种方法》删除元素的方法在序列容器和关联容器之间是非常不同的,在序列容器中,vector和string是最常用的,但这里也会介绍deque和list以供全面了解,尽管在一... 目录一、简介二、移除给定位置的元素三、移除与某个值相等的元素3.1、序列容器vector、deque