当前位置: 首页 > news >正文

链式二叉树统计结点个数的方法和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.lryc.cn/news/115587.html

相关文章:

  • C语言-报错集锦-03-malloc(): memory corruption: 0x0000000001496d90 ***
  • 现代C++中的从头开始深度学习:【5/8】卷积
  • 以太网帧格式与吞吐量计算
  • vue中install方法
  • Flutter:文件读取—— video_player、chewie、image_picker、file_picker
  • vim的使用
  • 马氏杆法检查斜视
  • Mac电脑怎么使用“磁盘工具”修复磁盘
  • c++画出分割图像,水平线和垂直线
  • Python 程序设计入门(015)—— enumerate() 函数的用法
  • __dict__属性
  • k8s之Pod控制器
  • 逆元(求乘法逆元的几种方法)
  • 没点本事,还真做不好数字化转型
  • windows 10 远程桌面配置
  • OpenStreetMap 上基于A*搜索算法的C ++路线规划项目
  • java实现随机生成验证码
  • Positive证书是什么?
  • vulnhub靶场-y0usef笔记
  • 华为智选首款纯电轿跑“LUXEED”能大卖吗?
  • ArcGIS API for JavaScript 3.44 地图Demo示例合集
  • RFID工业识别技术:供应链智能化的科技颠覆
  • 行列转换两例的思考
  • 高德地图 SDK 接口测试接入(AndroidTest 上手)
  • 省电模式稳定电压显示IC32×4 LCD显示驱动芯片
  • 分布式架构的观测
  • 交替方向乘子
  • 9-数据结构-栈(C语言版)
  • C#,数值计算——用于从连续的数据值流估计任意分位数的计算方法与源程序
  • 实践分享:小程序事件系统设计