二叉树求解大小操作详解

devtools/2024/10/21 5:48:58/

目录

一、求所有结点个数

1.1 递归思路

1.2 递归分支图

1.3 递归栈帧图

1.4 C语言实现

二、求叶子结点个数

2.1 递归思路

2.2 递归分支图

2.3 递归栈帧图

2.4 C语言实现

三、求第K层的结点个数

3.1 递归思路

3.2 递归分支图

3.3 递归栈帧图

3.4 C语言实现

四、求二叉树高度

4.1 递归思路

4.2 递归分支图

4.3 递归栈帧图

4.4 注意事项

4.5 C语言实现


一、求所有结点个数

1.1 递归思路

考虑特殊情况:

  1. 如果是空节点,返回0

考虑一般情况:

  1. 总结点的数目就是左右子树所含结点的和加上自身结点

  2. 每个节点都可被看作根节点,去重复递归左右子树

1.2 递归分支图

1.3 递归栈帧图

1.4 C语言实现

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

二、求叶子结点个数

2.1 递归思路

考虑特殊情况:

  1. 如果是空节点,则返回0
  2. 如果是叶子结点,则返回1

考虑一般情况:

  1. 总结点的数目就是左右子树所含结点的和

  2. 每个节点都可被看作根节点,去重复递归左右子树

2.2 递归分支图

2.3 递归栈帧图

 

2.4 C语言实现

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

三、求第K层的结点个数

3.1 递归思路

考虑特殊情况:

  1. 如果结点为空,返回0
  2. 如果层数为1,返回1

考虑一般情况:

每个节点都可被看作根节点,去重复递归左右子树。那么此时层数要减去1

3.2 递归分支图

3.3 递归栈帧图

3.4 C语言实现

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

四、求二叉树高度

4.1 递归思路

考虑特殊情况:

  1. 如果结点为空,返回0

考虑一般情况:

  1. 高度就等于子树的高度加上自身的高度
  2. 返回的是左右子树中更大的值

4.2 递归分支图

4.3 递归栈帧图

4.4 注意事项

由递归的知识可知,函数每次调用都会建立栈帧,各个栈帧间互不影响,所以需要把每次得到的值存起来,不然每次调用都会去再次递归寻找。大大浪费时间,降低程序执行的效率。

4.5 C语言实现

int TreeHeight(BTNode* root)
{if (root == NULL){return 0;}int leftHeight = TreeHeight(root->left);int rightHeight = TreeHeight(root->right);return leftHeight > rightHeight ?leftHeight + 1 : rightHeight + 1;
}


http://www.ppmy.cn/devtools/42459.html

相关文章

Java代码审计---SpEL表达式注入

简单了解 SpEL(Spring Expression Language) 是 Spring 中的表达式语言,用于在运行时评估和处理表达式。它提供了一种灵活的方式来访问和操作对象的属性、方法和其他表达式。SpEL可以用于配置文件、注解、XML 配置等多种场景,用于…

k8s遇到的错误记录

时隔四年有开始重新鼓捣k8s了,重新安装后遇到的错误记录如下: Error: Package: kubelet-1.14.0-0.x86_64 (kubernetes) Requires: kubernetes-cni 0.7.5 Available: kubernetes-cni-0.3.0.1-0.07a8a2.x86_64 (kubernetes) …

Python 全栈体系【四阶】(五十二)

第五章 深度学习 十二、光学字符识别(OCR) 2. 文字检测技术 2.1 CTPN(2016) 2.1.1 概述 CTPN全称Detecting Text in Natural Image with Connectionist Text Proposal Network(基于连接文本提议网络的自然图像文本…

pdfbox pdf转换图片时中文丢失,变成方框,提示No glyph for xxx in font STSong-Light

使用pdfbox转换图片时,转换出来的图片中文丢失,变成方框。原因是由于服务器字体缺失,pdfbox在转换时找不到合适的字体。 有几种方案: 服务器安装字体,具体资源百度使用备用字体。 将pdfbox中的FontMapperImpl类&…

Nacos 进阶篇---Nacos服务端怎么维护不健康的微服务实例 ?(七)

一、引言 在 Nacos 后台管理服务列表中,我们可以看到微服务列表,其中有一栏叫“健康实例数” (如下图),表示对应的客户端实例信息是否可用状态。 那Nacos服务端是怎么感知客户端的状态是否可用呢 ? 本章…

Java通用三级菜单工具类

Java通用三级菜单工具类 通常在写三级菜单时会使用递归方式去写,但是时间长了会发现很多重复的代码一直在写,改,也就改几个名字。 实现方式 抽象属性结构 常用的三个字段,子级id、父级id、其次是数组children。 将返回对象或…

Linux 进程

文章目录 冯诺依曼体系 操作系统为什么要有操作系统系统调用和库函数概念进程的组成如何理解进程动态运行系统调用接口和用户操作接口 进程PCBPIDPCB和PIDgetpid()getppid()获取父进程pidfork() 创建进程父子进程为什么要创建子进程/proc 目录内查看进程文件夹chdir()改变进程的…

【文末附gpt升级方案】AIGC(人工智能):技术革命与人类未来的深度解析

AIGC(人工智能):技术革命与人类未来的深度解析 摘要:随着科技的不断进步,人工智能(AI)已成为现代社会的重要支柱。其中,AIGC(Artificial Intelligence Generated Conten…