数据结构之树&&二叉树<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));
    }
};
相关推荐
wo_jack3 小时前
C++ 入门笔记(十七):list 入门 —— 为什么 list 不能 sort?
数据结构·c++·面试·stl·list
zaizai10075 小时前
算法(左程云)1
数据结构
charliejohn6 小时前
计算机考研 408 数据结构 图论-关键路径
数据结构·图论
David猪大卫1 天前
【C++修炼】map 和 set 的使用
c语言·开发语言·数据结构·c++·经验分享·笔记·学习
vvilkim1 天前
数据结构类型、区别与应用场景:一篇讲透选型逻辑
数据结构
阿卡好可爱1 天前
Lua 热更新不生效:改完文件线上仍是旧逻辑,package.loaded 与 upvalue 重绑定详解
数据结构·分布式·后端·架构·lua
心仪久了会沦陷2 天前
C语言数据结构入门——树与二叉树详解:概念、堆实现与链式遍历
c语言·数据结构·算法
码少女2 天前
数据结构——图的基础
数据结构
Severus_black2 天前
【C++初阶】list使用及相关实现,思路顺滑流畅!
c语言·数据结构·c++·stl·list