首页 > 其他分享 >二叉树的结点个数

二叉树的结点个数

时间:2023-08-01 16:07:22浏览次数:27  
标签:结点 return int TreeSize 个数 ++ 二叉树 root size

二叉树的节点个数

假设二叉树如下图所示:

image-20230712095939682

要想知道二叉树的节点个数,我们通常会想到遍历二叉树的同时使用一个变量来记录,假设变量为size,使用前序遍历,每遍历一个结点让size++,可设置程序如下:

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

但是我们需要注意的是size变量是局部变量,是建立在函数栈帧中的,在递归程序中,每建立一个函数栈帧都会创建一个size局部变量,因此这里的size++是对不同函数栈帧中的size进行处理的,并不能达到我们想要的效果。

那如果我们设置一个size静态变量是否可以呢?

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

size被static修饰之后就不再存储在栈区,而是存储在静态区,静态局部变量(静态局部变量只能在定义函数内使用)是在编译期间就指定的,所以运行期间每次递归都不会再重新创建变量size,所以每次++的时候用的是同一个size。

但是设置静态变量后第一次调用TreeSize函数时,可以正确的计算出结点个数,但是当我们再次调用的时候就不能正确计算出来了,会发现结果越来越大,因为静态变量和全局变量的作用域都是整个程序,只有在第一次进入函数时才会进行初始化,

这是因为静态变量与全局变量的作用域都是整个程序,所以只有在第一次进入函数时才会在定义的同时进行初始化,可以通过将size = 0直接把 size 赋值为0,但是如果这样的话找不到合适的位置将size赋值为0。

我们可以设置一个全局变量size,然后每次在调用TreeSize函数的时候将size变量赋值为0,同时TreeSize函数不用再有返回值。

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

测试:

int main()
{
    BTNode* root = CreatBinaryTree();
    TreeSize(root);
    printf("%d\n", size);//输出6
    size = 0;
    TreeSize(root);
    printf("%d\n", size);//输出6
}

这种办法并不好,每次还要将size置为0,我们可以通过使用分治思想,把大问题分解成小问题,逐层统计:通过计算节点子树的节点数量,并把统计到的节点数量加一(即加上结点本身),返回给该节点的父节点。

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

标签:结点,return,int,TreeSize,个数,++,二叉树,root,size
From: https://blog.51cto.com/u_15562309/6923244

相关文章

  • 输出一个数的二进制
    1//输出一个数的二进制2#include<stdio.h>3intmain()4{5intnum;6unsignedmask;7scanf_s("%d",&num);8mask=1u<<31;//定义一个最大位数的二进制数,首位为1,其余为09for(;mask;mask>>=1)//每次1右移一位,直到mask为010......
  • 代码随想录算法训练营第五天|力扣242.有效的字母异位词、力扣242.两个数组的交集、力
    哈希表哈希表理论基础哈希表,又称为散列表(HashTable),是根据关键码的值而直接进行访问的数据结构其中,数组就是一张哈希表;表中关键码就是数组的索引下标,然后通过下标直接访问数组中的元素哈希表解决的问题:一般哈希表都是用来快速判断一个元素是否出现在集合中哈希函数:把学生的......
  • 代码随想录算法训练营第三天| LeetCode 242.有效的字母异位词 349. 两个数组的交集
    242.有效的字母异位词    卡哥建议: 这道题目,大家可以感受到数组用来做哈希表给我们带来的遍历之处。    题目链接/文章讲解/视频讲解: https://programmercarl.com/%E5%93%88%E5%B8%8C%E8%A1%A8%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%80.html   做题思路:......
  • 算法训练 与1连通的点的个数
    主要思想是并查集,不懂的可以先了解下这个算法再来做题就明白了。c++实现:#include<iostream>#include<vector>usingnamespacestd;intf[10000];//找根节点intfind(intx){if(f[x]!=x)f[x]=find(f[x]);returnf[x];//不要加els......
  • 一个数据丢失惨案
    前言最近,有开发同事联系我反馈一个问题,说开发环境出现了数据丢失的情况,想让DBA帮忙排查一下是不是数据库的问题。我心想大概率是程序bug,不太可能是数据库的问题。不过还是要排查一下才会心安,毕竟对于一个DBA而言,数据丢失无疑是最令人紧张的一件事情。问题排查开始进行排查之前,......
  • 代码随想录第四天|力扣24.两两交换链表节点、力扣19.删除链表的倒数第N个结点、力扣面
    两两交换链表中的节点(力扣24.)dummyhead.next=head;cur=dummyhead;while(cur.next!=null&&cur.next.next!=null)temp=cur.next;temp1=cur.next.next.next;cur.next=cur.next.next;cur.next.next=temp;temp.next=temp1;cur=cur.next.next;returndummyhead.n......
  • 110. 平衡二叉树
    给定一个二叉树,判断它是否是高度平衡的二叉树。本题中,一棵高度平衡二叉树定义为:一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过1。示例1:输入:root=[3,9,20,null,null,15,7]输出:true#Definitionforabinarytreenode.#classTreeNode:#def__init__(se......
  • 2023-07-29:给你一个由数字组成的字符串 s,返回 s 中独特子字符串数量。 其中的每一个数
    2023-07-29:给你一个由数字组成的字符串s,返回s中独特子字符串数量。其中的每一个数字出现的频率都相同。答案2023-07-29:大体步骤如下:1.初始化变量base为固定值1000000007,用于计算哈希码。2.创建一个空的哈希集合set,用于存储独特子字符串的哈希码。3.创建一个长度为10的整数数组cn......
  • 2023-07-29:给你一个由数字组成的字符串 s,返回 s 中独特子字符串数量。 其中的每一个数
    2023-07-29:给你一个由数字组成的字符串s,返回s中独特子字符串数量。其中的每一个数字出现的频率都相同。答案2023-07-29:大体步骤如下:1.初始化变量base为固定值1000000007,用于计算哈希码。2.创建一个空的哈希集合set,用于存储独特子字符串的哈希码。3.创建一个长度为10的整......
  • 树与二叉树
    树的概念:根有子节点,子节点又是一个子树的根T1,T2,T3换一个顺序就不是原来的树了,就称为有序树,T1,T2,T3换一个顺序就还是原来的树,就称为无序树二叉树不是树的特殊情况,二叉树中的一个结点必须表明该结点是左节点还是右节点,即便它没有兄弟结点。而树不必区分左右。  二叉......