数据结构之树&&二叉树<5>---二叉树OJ

如何计算二叉树的节点个数???

第一种就是设计一个全局变量来记录节点

第二种就是用递归的思想

方法一:全局变量计数

思路:定义全局变量gsize,递归遍历二叉树,每访问到一个有效节点,计数 + 1

cpp 复制代码
int gsize = 0;
void TreeSize1(BTNode* root)
{
	if (root == NULL)
	{
		return;
	}
	gsize++;
	TreeSize1(root->left);
	TreeSize1(root->right);
}

缺点:

  1. 全局变量有状态残留,多次调用必须手动清零,非常容易出错;
  2. 如果多棵树同时统计,全局变量会互相干扰;
方法二:分治递归

递归思想:当前树节点数 = 1(自己) + 左子树节点数量 + 右子树节点数量

cpp 复制代码
int TreeSize2(BTNode* root)
{
	if (root == NULL)
	{
		return 0;
	}
	return 1 + TreeSize2(root->left) + TreeSize2(root->right);
}

优点:

  1. 无全局变量,无残留状态,每次调用独立计算
  2. 代码简洁,符合分治思想,面试最推荐写法;
  3. 不用手动清零,不会多次调用叠加。

2.

104. 二叉树的最大深度 - 力扣(LeetCode)

题目描述

给定二叉树根节点 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));
    }
};
相关推荐
linx2951 小时前
单元七 · 零基础路线图-第 1–3 周·变量、类型与字符串
c语言·开发语言·数据结构·c++·算法
Benny_Tang2 小时前
「雅礼集训 2018 Day7」A 题解
数据结构·c++·算法
Lyyaoo.2 小时前
【回溯】【中等】全排列
java·数据结构·算法
All for pursuit.2 小时前
【数组-5】560.和为K的子数组
数据结构·c++·算法·leetcode
星子yu3 小时前
【Java数据结构】二叉树 好像就这样?
java·数据结构
Beyond_System|系统之外3 小时前
【学编程】Python基础编程题100道(1-20)
java·数据结构·算法
船厂电气自动化ai大模型3 小时前
AI大模型与数学 第75课 基、维度、向量空间坐标
数据结构·线性代数·算法·机器学习·推荐算法
程序员阿鹏14 小时前
为什么MySQL InnoDB选择B+树?
数据结构·数据库·b树·sql·mysql·算法·缓存
郝学胜-神的一滴16 小时前
C++11 工程级应用 09:告别无谓拷贝,解锁高性能移动语义
开发语言·数据结构·c++·vscode·软件工程·visual studio