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

news2024/11/25 13:47:11

方法一:

分治:分而治之

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.coloradmin.cn/o/848338.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Spring 是如何解决循环依赖问题的?

项目场景: 提示:这里简述项目相关背景: 例如:项目场景:示例:通过蓝牙芯片(HC-05)与手机 APP 通信,每隔 5s 传输一批传感器数据(不是很大) 问题描述 我们都知道,如果在代码中,将两个…

高忆管理:券商板块探底回升,大市值券商企稳,中信建投涨超5%

近日活泼的券商板块8日盘中大幅回落,哈投股份一度跌停,后探底上升。大市值券商企稳,截至发稿,中金公司触及涨停,中信建投涨超5%。 首创证券一度大跌近9%,此前接连三日涨停,公司昨日晚间公告称&a…

【Vue】全家桶之vue-devtools

文章目录 概述安装使用componentsVuexEventsRoutingPerformanceSettings 来源 概述 Vue Devtools 是 Vue 官方发布的调试浏览器插件,可以安装在 Chrome 和 Firefox 等浏览器上,直接内嵌在开发者工具中,使用体验流畅。Vue Devtools 由 Vue.js…

9-数据结构-栈(C语言版)

数据结构-栈(C语言版) 目录 数据结构-栈(C语言版) 1.栈的基础知识 1.入栈,出栈的排列组合 情景二:Catalan函数(计算不同出栈的总数) 2.栈的基本操作 1.顺序存储 (1)顺序栈-定义…

在QT及VS运行包含opencv的cmakelists实例

本文分享如何利用QT和Visual Studio运行cmake组织管理的程序&#xff0c;也就是运行cmakelists.txt。 main和cmakelists内容 main和cmakelists文件路径如下&#xff1a; main.cpp #include<opencv2/opencv.hpp> #include<iostream> #include <string> usi…

ElementPlus 自定义主题(Vite4 + Vue3)

配置 ElementPlus 主题的时候遇到 SCSS 循环导入的报错&#xff0c;排查后发现是以为在 main.ts 和 vite.config.ts 中引入了两次自定义主题的样式文件&#xff0c;解决方法很简单&#xff0c;去掉 main.ts 中导入自定义主题的文件即可。这个问题发生在按需导入的时候&#xff…

vue实现大转盘抽奖

本案例为在小程序中实现的转盘抽奖&#xff0c;其他手机端项目思路类似。 注意&#xff1a; 转盘上的东西是由后台web项目里的配置页进行配置的&#xff0c;可以配置每个位置的奖品&#xff0c;中奖概率等。此文章只讲了抽奖转盘的实现&#xff0c;配置可根据真实需求进行开发…

web前端之CSS操作

文章目录 一、CSS操作1.1 html元素的style属性1.2 元素节点的style属性1.3 cssText属性 二、事件2.1 事件处理程序2.1.1 html事件2.1.2 DOM0事件&#xff08;适合单个事件&#xff09;2.1.3 DOM2事件&#xff08;适合多个事件&#xff09; 2.2 事件之鼠标事件2.3 事件之Event事…

网络编程的使用

文章目录 基础代码URL类进行传输编码解码 协议TCPUDPhttp PORT端口协议的实现TCPUDP 模拟服务器 基础代码 最后一个是&#xff1a;只要再timeout时间内连接上就是true URL类 导了一个common-iojar包&#xff0c;那个IOUtils就是那个里面的工具类 进行传输编码解码 协议 TC…

VSCode Remote-SSH (Windows)

1. VSCode 安装 VSCode 2. 安装扩展 Remote SSH Getting started Follow the step-by-step tutorial or if you have a simple SSH host setup, connect to it as follows: Press F1 and run the Remote-SSH: Open SSH Host… command.Enter your user and host/IP in the …

安防监控视频汇聚平台EasyCVR分发的FLV视频流在VLC中无法播放是什么原因?

众所周知&#xff0c;TSINGSEE青犀视频汇聚平台EasyCVR可支持多协议方式接入&#xff0c;包括主流标准协议国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等。在视频流的处理与分发上&#xff0c;视频监控…

在SAP中使用苹果手机进行条码扫描

适用于iOS的Liquid UI支持使用内置摄像头或第三方设备&#xff08;如Linea Pro&#xff09;进行条形码扫描。它使您能够通过单击在任何 SAP 输入字段中填充数据。它支持&#xff1a;一维和二维条码扫描。此外&#xff0c;编辑扫描的数据或在扫描后对操作进行编程&#xff0c;以…

JWT的初步说明

JWT 概念 JWT 主要用于用户登录鉴权&#xff0c;JWT (全称&#xff1a;Json Web Token)是一个开放标准(RFC 7519)&#xff0c;它定义了一种紧凑的、自包含的方式&#xff0c;用于作为 JSON 对象在各方之间安全地传输信息。该信息可以被验证和信任&#xff0c;因为它是数字签名…

【深度学习注意力机制系列】—— SENet注意力机制(附pytorch实现)

深度学习中的注意力机制&#xff08;Attention Mechanism&#xff09;是一种模仿人类视觉和认知系统的方法&#xff0c;它允许神经网络在处理输入数据时集中注意力于相关的部分。通过引入注意力机制&#xff0c;神经网络能够自动地学习并选择性地关注输入中的重要信息&#xff…

巡课技巧,工作再忙也要学会!提高效率杠杠的

在当今不断演变的教育环境中&#xff0c;教学质量的提升和教师专业发展变得尤为重要。为了更好地监督和评估教师的教学表现&#xff0c;以及促进学生在课堂中的积极参与&#xff0c;在线巡课系统应运而生。 通过实时观察、远程巡课、数据分析等功能&#xff0c;该系统不仅为教育…

LVS负载均衡部署-NAT

文章目录 LVS-NAT模式配置原理实验环境DR添加网卡准备两台Real Server134&#xff1a;145&#xff1a;测试&#xff1a; 修改RS网关配置DR&#xff1a;开启路由转发下载软件配置查看配置 测试 LVS-NAT模式配置 原理 当客户端访问DR时即访问的外网接口然后由DR将流量在本地转发…

Do not access Object.prototype method ‘hasOwnProperty‘ from target object

调用 hasOwnProperty 报错&#xff1a;不要使用对象原型上的方法&#xff0c;因为原型的方法可能会被重写 if (this.formData.selectFields.hasOwnProperty(selectField)) {delete this.formData.selectFields[selectField];} else {this.formData.selectFields[selectField] …

HIVE学习

1.什么是HIVE 1.HIVE是什么? Hive是由Facebook开源&#xff0c;基于Hadoop的一个数据仓库工具&#xff0c;可以将结构化的数据文件映射为一张表&#xff0c;并提供类SQL查询功能。 大白话: HIVE就是一个类似于Navicat的可视化客户端, 2.HIVE本质 Hive是一个Hadoop客户端&a…

Java、Android 之 TCP / IP

TCP、IP是一系列协议组成的网络分层模型 客户端向服务端发送请求可能会走N条链路&#xff0c;这个过程叫路由 TCP传输 一般在1--1024端口 必须连接以后才能传输数据 UDP协议通常只是发送数据 TCP连接 TCP需要建立连接才能通信&#xff0c;建立连接需要端口&#xff0c;Sock…

怎么用PS的魔术棒抠图?PS魔术棒抠图的操作方法

使用PS的魔术棒抠图教程&#xff1a; 1、首先&#xff0c;在ps界面上方点击“文件”选项&#xff0c;再在其弹出的选项栏中选择“打开”选项。然后&#xff0c;打开你所需要的图片。 2、然后&#xff0c;单击左侧的“魔术棒”工具。 3、然后&#xff0c;用鼠标点击图片的背景&…