数据结构-二叉树(统计二叉树的结点个数递归与非递归算法)
文章目录
- 思路
- Java 实现
思路
求结点个数为什么能用递归?
二叉树求结点个数,从根结点开始,求二叉树结点个数,对于根结点就是求左右子树所有结点数之和再加一,对于左右子树又是如此计算,这样的形式满足递归的思想,大问题化小问题,小问题有一个最终的出口,出口就是最下面那个结点左右子树为空,这样空节点的结点个数为 0
如何用栈来思考二叉树结点个数?
就是二叉树的遍历,先序中序后序,层次遍历皆可以,栈中的数据是从没有到不断存入,到最后栈为空,所以我们可以在 push 后让结点 count 加一,或者在 pop 时候让结点 count 加一都可以,下面例子我才用中序遍历的非递归算法,然后 push 时加一来处理
Java 实现
// 结点
class Node {int data;Node left = null;Node right = null;
}// 二叉树
public class BinaryTree {// 根结点private Node root;// 输入的数组private int[] arr_in;// 输出的数组private int[] arr_out;// 记录数组下标private static int index;// 初始化public BinaryTree(int[] arr) {root = new Node();this.arr_in = arr;arr_out = new int[arr.length];index = 0;}// 得到二叉树结点的个数(递归)public int getNodesNumber(Node r) {if (r)return getNodesNumber(r.left) + getNodesNumber(r.right) + 1;elsereturn 0;}// 得到二叉树结点的个数(非递归)public int getNodesNumber(Node r) {Stack stack = new Stack();Node node = r;int count = 0;if (node) {stack.push(node);count++;node = node.left}else {Node top = stack.pop();node = top.right;}return count;}
数据结构-二叉树(统计二叉树的结点个数递归与非递归算法)相关推荐
- 数据结构二叉树中序遍历递归和非递归算法
2022.11.19 二叉树中序遍历递归和非递归算法 任务描述 相关知识 编程要求 测试说明 C/C++代码 任务描述 本关任务:给定一棵二叉树,使用递归和非递归的方法实现二叉树的中序遍历结果. 相关 ...
- 全排列之递归与非递归算法实现总结
全排列之递归与非递归算法实现总结 递归实现 常见的是基于交换的,原理:从而可以推断,设一组数p = {r1, r2, r3, ... ,rn}, 全排列为perm(p),pn = p - {rn}. ...
- Java实现折半查找(二分查找)的递归和非递归算法
Java二分查找实现,欢迎大家提出交流意见. /** *名称:BinarySearch *功能:实现了折半查找(二分查找)的递归和非递归算法. *说明: * 1.要求所查找的数组已有序,并且其 ...
- 树与二叉树——二叉树中计算叶子结点个数问题
1.已知完全二叉树具有967个结点,则其叶子结点个数为: 详解: 首先明确一点该二叉树是一棵二叉树,那可以使用二叉树的一些性质. 从第一层开始计算每层的节点个数:1,2,4,8,16,32,64,12 ...
- 二叉树的先中后序递归和非递归遍历(数据结构作业)
一.设计思想 我创建二叉树是用的先序创建,其中用'#'代表空节点. 1.递归先序遍历 (1)如果当前节点为空节点(用'#'代表空节点),结束当前函数 (2)打印当前节点 (2)递归当前节点的左子树 ( ...
- 获取二叉树叶子节点个数的递归及非递归算法
递归算法 public static<T> int numOfLeavesInRecursion(BinaryTreeNode<T> root){ // 获取二叉树叶子节点的个 ...
- 二叉树的前中后序递归和非递归遍历操作【代码】
"遍历"是二叉树各种操作的基础,可以在遍历过程中对节点进行各种操作,如:求节点的双亲,求节点的孩子,判断节点的层次.当然,还有一些更重要的操作,例如,依据遍历序列建立二叉树,对建立 ...
- 二叉树遍历算法详解(递归法+非递归法)
二叉树遍历算法详解 在上一篇C语言实现二叉树中有提到对于二叉树的遍历,包括前序,中序和后续遍历,以及层次遍历 大家已经熟悉了二叉树的前中后序遍历过程,大部分都采用了递归的思想来实现 在leetcode ...
- 二叉树的四种遍历方式(递归和非递归双重实现)
写在前面:博主是一位普普通通的19届双非软工在读生,平时最大的爱好就是听听歌,逛逛B站.博主很喜欢的一句话花开堪折直须折,莫待无花空折枝:博主的理解是头一次为人,就应该做自己想做的事,做自己不后悔的事 ...
最新文章
- CV_IMAGE_ELEM参数赋值时注意的问题
- box unboxing(装箱 拆箱) C#编程指南
- 购物车Demo,前端使用AngularJS,后端使用ASP.NET Web API(3)--Idetity,OWIN前后端验证
- python操作系统接口错误_Python os模块和sys模块 操作系统的各种接口
- django模型——数据库(二)
- ICCV 2019 | ActivityNet 挑战赛冠军方案—时序动作提名,边界匹配网络详解
- java中Long的比较
- mysql的sql性能分析器
- JavaScript动态显示当前时间和倒计时的设计(附全码)_AX
- 量化指标公式源码_通达信博尔量化指标 看了就明白 源码
- 计算机辅助公差技术主要研究内容,计算机辅助形位公差类型生成技术的分析研究.pdf...
- java web 甘特图_基于Web开发的甘特图控件,支持Java、.Net
- redis keys命令,生产环境慎用,最好屏蔽掉
- 实践 ArcGIS Web 3D
- python画机器猫
- 秦安三中2021高考一成绩查询,喜报!天水一中、三中、五中2019年高考成绩来了!...
- C的编译链接及Makefile学习
- 拼多多怎么发布机会产品|百择电商
- 消息中间件:选型分析。
- 社会工程学与APT攻击之——社工防御方法