数据结构之树&&二叉树<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));
    }
};
相关推荐
suhan33 分钟前
【数据结构】六、图:4.图的遍历(深度优先算法DFS、广度优先算法BFS)
数据结构·算法·排序算法
suhan34 分钟前
【数据结构】六、图:3.十字链表、邻接多重表、边集数组
数据结构·算法·排序算法
kiracrimson1 小时前
STL简单引入:把数据结构做成模板
开发语言·数据结构·c++
HPtiger2 小时前
交换类排序详解:冒泡排序与快速排序
数据结构·算法·排序算法
kyle~2 小时前
数据结构 --- 无锁队列(Lock-Free Queue)
linux·数据结构·c++·多线程·并发
Cccp.1233 小时前
【leetcode】(十四)从暴力递归到动态规划
数据结构·算法·leetcode·动态规划
凤凰院凶涛QAQ13 小时前
《Java版数据结构 & 集合类剖析》Map & Set & 反射:“从哈希碰撞到红黑树转换,反射帮你扒开 HashMap 的桶数组看个究竟”
java·数据结构·算法
H.莓飛13 小时前
【数据结构】排序_OJ题(一):计数、桶与排序后的处理
java·开发语言·数据结构
w_zero_one15 小时前
算法--模拟
java·数据结构·算法
fish_zzzz20 小时前
笔记-论数据结构1
数据结构