链式二叉树统计结点个数的方法和bug

方法一:

分治:分而治之

int BTreeSize1(BTNode* root)
{if (root == NULL) return 0;else return BTreeSize(root->left)+BTreeSize(root->right)+1;
}

方法二:

遍历计数:设置一个计数器,对二叉树正常访问,访问到一个结点就让这个计数器++。应要求,我们应该设置一个static静态变量。

int BTreeSize2(BTNode* root)
{static int size = 0;if (root == NULL) return size;else size++;BTreeSize2(root->left);BTreeSize2(root->right);return size;
}

下面对这两种方法进行验证。

创建一个二叉树:

typedef int BTDataType;
typedef struct BinaryTreeNode
{BTDataType data;struct BinaryTreeNode* left;struct BinaryTreeNode* right;
}BTNode;
BTNode* BuyNode(BTDataType x)
{BTNode* node = (BTNode*)malloc(sizeof(BTNode));if (node == NULL){perror("malloc fail::");return;}node->data = x;node->left = NULL;node->right = NULL;return node;
}
BTNode* CreatBinaryTree()
{BTNode* node1 = BuyNode(1);BTNode* node2 = BuyNode(2);BTNode* node3 = BuyNode(3);BTNode* node4 = BuyNode(4);BTNode* node5 = BuyNode(5);BTNode* node6 = BuyNode(6);node1->left = node2;node1->right = node4;node2->left = node3;node4->left = node5;node4->right = node6;return node1;
}

验证代码:

int main() 
{BTNode* root = CreatBinaryTree();printf("%d\n", BTreeSize1(root));printf("%d\n", BTreeSize2(root));return 0;
}

验证结果正确。

 但是,方法二里面仍然存在一些问题。

static静态变量size,在此函数中,理论上是一个局部变量,但是其生命周期却是全局变量。

所以,这就会导致多次访问此函数时,出现累加现象:

运行结果:

从而导致结果不准确。

而且,因为其为局部变量,无法在函数调用后,在函数外部手动置零,继而产生无法修补的大坑。

 结论:方法二不可行

 

如果真要实现方法二这种思路,则应设置全局变量,然后每次计算完成后,手动置零。

int size = 0;
void BTreeSize2(BTNode* root)
{if (root == NULL) return;else size++;BTreeSize2(root->left);BTreeSize2(root->right);return;
}
int main()
{BTNode* root = CreatBinaryTree();BTreeSize2(root);printf("%d\n",size);size = 0;BTreeSize2(root);printf("%d\n", size);size = 0;BTreeSize2(root);printf("%d\n", size);return 0;
}

验证结果正确:

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/80816.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OpenCV之信用卡识别实战

文章目录 代码视频讲解模板匹配文件主程序(ocr_template_match.py)myutils.py 代码 链接: https://pan.baidu.com/s/1KjdiqkyYGfHk97wwgF-j3g?pwdhhkf 提取码: hhkf 视频讲解 链接: https://pan.baidu.com/s/1PZ6w5NcSOuKusBTNa3Ng2g?pwd79wr 提取码: 79wr 模板匹配文件 …

Linux下.py文件只读问题以及解决过程

一、问题描述 如图,在Ubuntu Linux系统中使用pycharm管理项目文件时,无法编辑,提示文件为只读: 点击"OK"后仍旧无法清除只读模式,并报错: 二、问题解决 将问题定性为文件权限相关问题&#…

将http协议升级为https协议——域名平台部分的设置

为远程群晖NAS的自定义域名免费申请SSL证书 文章目录 为远程群晖NAS的自定义域名免费申请SSL证书前言1. 向域名平台申请SSL证书1.1 购买“免费证书” 2. 进一步进行创建证书设置2.1 对证书的关联域名进行补充 3. 云解析DNS3.1 进行验证信息 前言 我们可以成功地将自己购买的域…

RN 使用react-navigation写可以滚动的横向导航条(expo项目)

装包: yarn add react-navigation/material-top-tabs react-native-tab-view npx expo install react-native-pager-view import React from react import { View, Text, ScrollView, SafeAreaView } from react-native import { Icon } from ../../../../../compo…

Linux文件属性与权限管理(可读、可写、可执行)

Linux把所有文件和设备都当作文件来管理,这些文件都在根目录下,同时Linux中的文件名区分大小写。 一、文件属性 使用ls -l命令查看文件详情: 1、每行代表一个文件,每行的第一个字符代表文件类型,linux文件类型包括&am…

【redis基础】

目录 一、概述 1.NoSQL 1.1 简述 1.2 类型 1.3 应用场景 1.3.1 缓存 1.3.2 分布式锁 1.3.3 计数器 1.3.4 会话管理 1.3.5 消息队列 2.Redis 2.1 简述 2.2 特性 2.3 监听端口号 2.4 数据类型 二、安装 1.编译安装 2.RPM安装 三、目录结构 1.查看 2.主配置文…

使用toad库进行机器学习评分卡全流程

1 加载数据 导入模块 import pandas as pd from sklearn.metrics import roc_auc_score,roc_curve,auc from sklearn.model_selection import train_test_split from sklearn.linear_model import LogisticRegression import numpy as np import math import xgboost as xgb …

心理咨询预约管理系统javaweb医院挂号jsp源代码mysql

本项目为前几天收费帮学妹做的一个项目,Java EE JSP项目,在工作环境中基本使用不到,但是很多学校把这个当作编程入门的项目来做,故分享出本项目供初学者参考。 一、项目描述 心理咨询预约管理系统javaweb MVC模式,普…

活动发布会邀请媒体6步走

传媒如春雨,润物细无声,大家好,我是51媒体网胡老师。 邀请媒体参加活动发布会对信息的传播,企业品牌建设有诸多的好处,今天就与大家分享下邀请媒体参加活动报道的6个步骤: 1. 策划与准备: -明…

构建Docker容器监控系统(Cadvisor +InfluxDB+Grafana)

目录 案例概述 Cadvisor InfluxDBGrafana 1.1、 Cadvisor 1.2、InfluxDB 1.3、Grafana 1.4、监控组件架构 1.5、开始部署 安装docker-ce 阿里云镜像加速器 创建自定义网络 创建influxdb容器 案例概述 Docker作为目前十分出色的容器管理技术,得到大量企业…

基于Java+SpringBoot+Vue的企业客户信息反馈平台设计与实现(源码+LW+部署文档等)

博主介绍: 大家好,我是一名在Java圈混迹十余年的程序员,精通Java编程语言,同时也熟练掌握微信小程序、Python和Android等技术,能够为大家提供全方位的技术支持和交流。 我擅长在JavaWeb、SSH、SSM、SpringBoot等框架…

STM32 4G学习(二)

特性参数 ATK-IDM750C是正点原子开发的一款高性能4G Cat1 DTU产品,支持移动4G、联通4G和电信4G手机卡。 它以高速率、低延迟和无线数传作为核心功能,可快速解决应用场景下的无线数传方案。 它支持TCP/UDP/HTTP/MQTT/DNS/RNDIS/NTP协议,支持…

Clion开发Stm32之存储模块(W25Q64)驱动编写

前言 涵盖之前文章: Clion开发STM32之HAL库SPI封装(基础库) W25Q64驱动 头文件 #ifndef F1XX_TEMPLATE_MODULE_W25Q64_H #define F1XX_TEMPLATE_MODULE_W25Q64_H#include "sys_core.h" /* Private typedef ---------------------------------------------------…

STM32入门——定时器

内容为江科大STM32标准库学习记录 TIM简介 TIM(Timer)定时器定时器可以对输入的时钟进行计数,并在计数值达到设定值时触发中断16位计数器、预分频器、自动重装寄存器的时基单元,在72MHz计数时钟下可以实现最大59.65s的定时&…

广州VR制作 | 利用VR元宇宙平台开展林地管理培训的优势

在林业领域,实地调查是获取准确数据和深入了解森林生态的重要手段。然而,传统的实地调查方法存在诸多问题,如时间成本高、人力物力投入大、安全风险高等。为了解决这些教学痛点,我们引入了虚拟现实(VR)技术,通过虚拟林…

【JVM】 垃圾回收篇——自问自答(1)

Q什么是垃圾: 运行程序中,没用任何指针指向的对象。 Q为什么需要垃圾回收? 内存只分配,不整理回收,迟早会被消耗完。 内存碎片的整理,为新对象腾出空间 没有GC程序无法正常进行。 Q 哪些区域有GC&#…

react学习

1.react安装 2.react的使用 3.方法说明 4.初始化react脚手架 5.在脚手架中使用react 6.JSX 7.JSX需要注意的点 8.在JSX中使用JS 需要注意的点 9.条件渲染 10.列表渲染 11.样式处理 12.react组件 两种创建方式: 函数创建: 类组件: 13.事件 事件绑定 事件对象 14.有状态组件和…

2023年华数杯数学建模B题思路代码分析 - 不透明制品最优配色方案设计

# 1 赛题 B 题 不透明制品最优配色方案设计 日常生活中五彩缤纷的不透明有色制品是由着色剂染色而成。因此,不透明 制品的配色对其外观美观度和市场竞争力起着重要作用。然而,传统的人工配色 存在一定的局限性,如主观性强、效率低下等。因此…

CentOS7 启动谷歌浏览器 java+Selenium+chrome+chromedriver

前言:自己想使用该技术实现自动化抓取音乐,目前在window上运行成功,需要在Linux Centos服务上跑,配置上出现了许多问题,特此记录。 参考文档:CentOS7 安装Seleniumchromechromedriverjava_远方丿的博客-CSD…

使用gitee创建远程maven仓库

1. 创建一个项目作为远程仓库 2. 打包项目发布到远程仓库 id随意&#xff0c;url是打包到哪个文件夹里面 在需要打包的项目的pom中添加 <distributionManagement><repository><id>handsomehuang-maven</id><url>file:D:/workspace/java/2023/re…