如何计算二叉树的节点个数???
第一种就是设计一个全局变量来记录节点
第二种就是用递归的思想
方法一:全局变量计数
思路:定义全局变量gsize,递归遍历二叉树,每访问到一个有效节点,计数 + 1。
cpp
int gsize = 0;
void TreeSize1(BTNode* root)
{
if (root == NULL)
{
return;
}
gsize++;
TreeSize1(root->left);
TreeSize1(root->right);
}
缺点:
- 全局变量有状态残留,多次调用必须手动清零,非常容易出错;
- 如果多棵树同时统计,全局变量会互相干扰;
方法二:分治递归
递归思想:当前树节点数 = 1(自己) + 左子树节点数量 + 右子树节点数量
cpp
int TreeSize2(BTNode* root)
{
if (root == NULL)
{
return 0;
}
return 1 + TreeSize2(root->left) + TreeSize2(root->right);
}
优点:
- 无全局变量,无残留状态,每次调用独立计算;
- 代码简洁,符合分治思想,面试最推荐写法;
- 不用手动清零,不会多次调用叠加。
2.
题目描述
给定二叉树根节点 root,求二叉树的最大深度。
二叉树的深度:从根节点到最远叶子节点的最长路径上的节点数量。 叶子节点:左右孩子都为
NULL的节点。
递归思路(分治思想,和前面统计节点数是一套递归范式)
一棵二叉树的最大深度 =
1(当前节点) + max(左子树深度,右子树深度)
- 递归终止条件:
root == NULL,空树深度为 0 - 先求左子树深度,再求右子树深度,取两者较大值,再加当前节点的 1
cpp
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
int maxDepth(TreeNode* root) {
if(root==NULL)
return 0;
return 1+fmax(maxDepth(root->left),maxDepth(root->right));
}
};