一,问题描述

构建一棵二叉树(不一定是二叉查找树),求出该二叉树中第K层中的结点个数(根结点为第0层)

二,二叉树的构建

定义一个BinaryTree类来表示二叉树,二叉树BinaryTree 又是由各个结点组成的,因此需要定义一个结点类BinaryNode,BinaryNode作为BinaryTree的内部类。

此外,在BinaryTree中需要一定一个BinaryNode属性来表示树的根结点。

public class BinaryTree> {

private static class BinaryNode{

T element;

BinaryNode left;

BinaryNode right;

public BinaryNode(T element) {

this.element = element;

left = right = null;

}

public BinaryNode(T element, BinaryNode left, BinaryNode right){

this.element = element;

this.left = left;

this.right = right;

}

}

private BinaryNode root;

//other code.....

第一行是二叉树类的定义,第三行是结点类的定义,第20行是二叉树根的定义。

三,求解第K层结点个数的算法实现

求第K层结点的个数也可以用递归来实现:

①若二叉树为空或者K小于0,返回0

②若K等于0,第0层就是树根,根只有一个,返回1

③若K大于0,返回左子树中第K-1层结点个数 加上 右子树中第K-1层结点的个数

因为,第K层结点,相对于根的左子树 和 右子树 而言,就是第K-1层结点

其实,这是有改进的地方:对于K<0的情形,准确地说:它只是一个非法输入,而不是递归的结束条件(基准条件)。可以看出,①不要把非法输入与递归的基准条件混淆,②把非法输入的判断放到递归中判断的开销是很大的。因为每进行一次递归就需要进行一次非法输入判断。而如果在开始就把非法输入过滤掉,在递归过程中就不会存在每一次递归就判断一次非法输入了。

递归的基准条件只有两个:

1) k==0 当递归到K==0时,说明:第K层是有结点的

2) root==null 当递归到root==null时,说明:第K层没有结点

因此,可以进一步将代码改进如下:这样,不需要在每次递归的过程中还可能附加一次 k<0 的判断

/**

*

* @param k

* @return 二叉树中第K层结点的个数(根位于第0层)

*/

public int k_nodes(int k){

if(k < 0)

return 0;

return k_nodes(root, k);

}

private int k_nodes(BinaryNode root, int k){

if(root == null)

return 0;

if(k == 0)

return 1;//根结点

else

return k_nodes(root.left, k-1) + k_nodes(root.right, k-1);

}

可参考:按层打印二叉树–每行打印一层 来测试每一层是否有正确的结点个数。

四,代码实现

public class BinaryTree> {

private static class BinaryNode{

T element;

BinaryNode left;

BinaryNode right;

public BinaryNode(T element) {

this.element = element;

left = right = null;

}

}

private BinaryNode root;

/**

* 向二叉树中插入一个元素

* @param element

*/

public void insert(T element){

root = insert(root, element);

}

private BinaryNode insert(BinaryNode root, T element){

if(root == null)

return new BinaryNode(element);

int r = (int)(2*Math.random());

//随机地将元素插入到左子树 或者 右子树中

if(r==0)

root.left = insert(root.left, element);

else

root.right = insert(root.right, element);

return root;

}

/**

*

* @param k

* @return 二叉树中第K层结点的个数(根位于第0层)

*/

public int k_nodes(int k){

return k_nodes(root, k);

}

private int k_nodes(BinaryNode root, int k){

if(root == null || k < 0)

return 0;

if(k == 0)

return 1;//根结点

else

return k_nodes(root.left, k-1) + k_nodes(root.right, k-1);

}

public static void main(String[] args) {

BinaryTree tree = new BinaryTree<>();

int[] ele = C2_2_8.algorithm1(4);//构造一个随机数组,数组元素的范围为[1,4]

for (int i = 0; i < ele.length; i++) {

tree.insert(ele[i]);

}

int k_nodes = tree.k_nodes(2);//第二层

int k_nodes2 = tree.k_nodes(-1);//第-1层

int k_nodes3 = tree.k_nodes(0);

int k_nodes4 = tree.k_nodes(1);

int k_nodes5 = tree.k_nodes(4);//若超过了树的高度,结果为0

System.out.println(k_nodes);

System.out.println(k_nodes2);

System.out.println(k_nodes3);

System.out.println(k_nodes4);

System.out.println(k_nodes5);

}

}

五,参考资料

http://blog.csdn.net/luckyxiaoqiang/article/details/7518888

https://www.cnblogs.com/hapjin/category/680818.html

求二叉树中结点个数代码java_求二叉树中第K层结点的个数相关推荐

  1. 求二叉树中第K层结点的个数

    一,问题描述 构建一棵二叉树(不一定是二叉查找树),求出该二叉树中第K层中的结点个数(根结点为第0层) 二,二叉树的构建 定义一个BinaryTree类来表示二叉树,二叉树BinaryTree 又是由 ...

  2. 二叉树的进阶操作---(求二叉树中所有结点个数,求叶子结点个数,求第k层结点个数;在二叉树中查找某一结点;层序遍历;判断是否为完全二叉树)

    typedef struct TreeNode {struct TreeNode *left;struct TreeNode *right;char val; }TreeNode;typedef st ...

  3. 求二叉树第K层的节点个数+求二叉树叶子节点的个数

    size_t _FindLeafSize(Node* root)     //求二叉树叶子节点的个数     {         //static size_t count = 0;          ...

  4. 入门二叉树,三种遍历,计算结点个数 ,深度 叶子结点个数,第k层结点个数

    1.关于二叉树的前中后序快速排序 那就在这里拿这张图来演示一下怎样快速写出中序遍历,我们都知道中序遍历是,左子树,根,右子树 B A C D E F H 最后直接得出结果DBEHACF 2.二叉树的五 ...

  5. 计算器的程序代码java_求用JAVA编写的计算器程序代码

    展开全部 import java.awt.*;//引入包java.awt中所有的类 import java.awt.event.*;//引入包java.awt.event中所有的类. public c ...

  6. 记事本改字体的代码java_求java记事本代码(带字体设置功能)?

    java中没有自带的字体对话框,这需要自己来编写. text.setFond("字体名字",字形(如,fond.bold),大小) import java.awt.*; impor ...

  7. 编写代码java_求大神帮忙!编写java代码!

    XhstormR //部门类 public class DeptVo { private String deptName; private int num; public DeptVo(String  ...

  8. java中的异常处理代码,java_深入剖析Java中的各种异常处理方式,1. 调试追踪代码:public s - phpStudy...

    深入剖析Java中的各种异常处理方式 1. 调试追踪代码: public static void enterTryMethod() { System.out.println("enter a ...

  9. 云服务器中获取文件代码,从云服务器中获取文件

    从云服务器中获取文件 内容精选 换一换 登录Windows操作系统的弹性云服务器时,需使用密码方式登录.因此,用户需先根据创建弹性云服务器时使用的密钥文件,获取该弹性云服务器初始安装时系统生成的管理员 ...

最新文章

  1. extjs4.0的高级组件grid补充01选择模式selection和表格特性feature
  2. 事务处理总结【JDBC事务|JTA事务|容器事务
  3. centos7启动与切换图形界面
  4. 阿里云 mysql 表锁死_解决阿里云数据库MySQL实例空间满自动锁问题
  5. 用计算机怎么计算税率,一般纳税人税率计算器,一般纳税人税率如何计算?
  6. 字节跳动的第一场败仗:烧光20亿,悟空问答终落幕
  7. 第七课,OpenGL之LookAt函数
  8. 刀片服务器的机箱显示器,思科 UCS 5100系列刀片服务器机箱
  9. 0day攻击防护措施有哪些?
  10. 解决Adobe Arcobat Reader DC打开PDF提示:正在准备文档以供阅读,请稍后
  11. jQuery获取子类第n个元素
  12. Leetcode_24_Swap Nodes in Pairs
  13. chrome 浏览器的快捷键设置
  14. linux下载流量和上传流量,通过linux的tc工具简单实现上传和下载的流量控制
  15. 内存分析(二) AVFrame
  16. Linux中Web项目部署以及基本指令
  17. 转载于烂泥博客,供个人学习kvm、mysql等知识
  18. HTML5个人博客首页demo
  19. [047量化交易]python获取股票 量比 换手率 市盈率-动态 市净率 总市值 流通市值
  20. GD32F350.SPI软件片选模式

热门文章

  1. TCP,UDP数据包的大小以及MTU
  2. hdfs fsck命令查看HDFS文件对应的文件块信息(Block)和位置信息(Locations)
  3. 5分钟入门Lindorm SearchIndex
  4. 阿里巴巴大数据实践—阿里巴巴的数据模型实践综述
  5. 简单五步,实现物联网批量创建设备
  6. 中小企业上云多地域办公组网,建立高质量云上内网环境
  7. 全球独家 | 赋予企业级开源无限可能,阿里云首发云数据库MongoDB 4.2版本
  8. 云原生人物志|Pulsar翟佳:社区的信任最重要
  9. 我的程序跑了 60 多小时,就是为了让你看一眼 JDK 的 BUG 导致的内存泄漏
  10. 泡着枸杞写bug的三流程序员凭什么逆袭到一线大厂?