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

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

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

相关文章

C# 比较两个list 之间元素差异的常用方法

《C#比较两个list之间元素差异的常用方法》:本文主要介绍C#比较两个list之间元素差异,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1. 使用Except方法2. 使用Except的逆操作3. 使用LINQ的Join,GroupJoin

从原理到实战深入理解Java 断言assert

《从原理到实战深入理解Java断言assert》本文深入解析Java断言机制,涵盖语法、工作原理、启用方式及与异常的区别,推荐用于开发阶段的条件检查与状态验证,并强调生产环境应使用参数验证工具类替代... 目录深入理解 Java 断言(assert):从原理到实战引言:为什么需要断言?一、断言基础1.1 语

MySQL中的索引结构和分类实战案例详解

《MySQL中的索引结构和分类实战案例详解》本文详解MySQL索引结构与分类,涵盖B树、B+树、哈希及全文索引,分析其原理与优劣势,并结合实战案例探讨创建、管理及优化技巧,助力提升查询性能,感兴趣的朋... 目录一、索引概述1.1 索引的定义与作用1.2 索引的基本原理二、索引结构详解2.1 B树索引2.2

一文详解Java Stream的sorted自定义排序

《一文详解JavaStream的sorted自定义排序》Javastream中的sorted方法是用于对流中的元素进行排序的方法,它可以接受一个comparator参数,用于指定排序规则,sorte... 目录一、sorted 操作的基础原理二、自定义排序的实现方式1. Comparator 接口的 Lam

python3如何找到字典的下标index、获取list中指定元素的位置索引

《python3如何找到字典的下标index、获取list中指定元素的位置索引》:本文主要介绍python3如何找到字典的下标index、获取list中指定元素的位置索引问题,具有很好的参考价值,... 目录enumerate()找到字典的下标 index获取list中指定元素的位置索引总结enumerat

如何使用Maven创建web目录结构

《如何使用Maven创建web目录结构》:本文主要介绍如何使用Maven创建web目录结构的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录创建web工程第一步第二步第三步第四步第五步第六步第七步总结创建web工程第一步js通过Maven骨架创pytho

Python循环结构全面解析

《Python循环结构全面解析》循环中的代码会执行特定的次数,或者是执行到特定条件成立时结束循环,或者是针对某一集合中的所有项目都执行一次,这篇文章给大家介绍Python循环结构解析,感兴趣的朋友跟随... 目录for-in循环while循环循环控制语句break语句continue语句else子句嵌套的循

CSS实现元素撑满剩余空间的五种方法

《CSS实现元素撑满剩余空间的五种方法》在日常开发中,我们经常需要让某个元素占据容器的剩余空间,本文将介绍5种不同的方法来实现这个需求,并分析各种方法的优缺点,感兴趣的朋友一起看看吧... css实现元素撑满剩余空间的5种方法 在日常开发中,我们经常需要让某个元素占据容器的剩余空间。这是一个常见的布局需求

Python中bisect_left 函数实现高效插入与有序列表管理

《Python中bisect_left函数实现高效插入与有序列表管理》Python的bisect_left函数通过二分查找高效定位有序列表插入位置,与bisect_right的区别在于处理重复元素时... 目录一、bisect_left 基本介绍1.1 函数定义1.2 核心功能二、bisect_left 与

Java空指针异常NullPointerException的原因与解决方案

《Java空指针异常NullPointerException的原因与解决方案》在Java开发中,NullPointerException(空指针异常)是最常见的运行时异常之一,通常发生在程序尝试访问或... 目录一、空指针异常产生的原因1. 变量未初始化2. 对象引用被显式置为null3. 方法返回null