一,问题描述

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

二,二叉树的构建

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

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

 1 public class BinaryTree<T extends Comparable<? super T>> {
 2
 3     private static class BinaryNode<T>{
 4         T element;
 5         BinaryNode<T> left;
 6         BinaryNode<T> right;
 7
 8         public BinaryNode(T element) {
 9             this.element = element;
10             left = right = null;
11         }
12
13         public BinaryNode(T element, BinaryNode<T> left, BinaryNode<T> right){
14             this.element = element;
15             this.left = left;
16             this.right = right;
17         }
18     }
19
20     private BinaryNode<T> root;
21
22 //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 的判断

 1     /**
 2      *
 3      * @param k
 4      * @return 二叉树中第K层结点的个数(根位于第0层)
 5      */
 6     public int k_nodes(int k){
 7         if(k < 0)
 8             return 0;
 9         return k_nodes(root, k);
10     }
11     private int k_nodes(BinaryNode<T> root, int k){
12         if(root == null)
13             return 0;
14         if(k == 0)
15             return 1;//根结点
16         else
17             return k_nodes(root.left, k-1) + k_nodes(root.right, k-1);
18     }

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

四,代码实现

 1 public class BinaryTree<T extends Comparable<? super T>> {
 2
 3     private static class BinaryNode<T>{
 4         T element;
 5         BinaryNode<T> left;
 6         BinaryNode<T> right;
 7
 8         public BinaryNode(T element) {
 9             this.element = element;
10             left = right = null;
11         }
12     }
13
14     private BinaryNode<T> root;
15
16     /**
17      * 向二叉树中插入一个元素
18      * @param element
19      */
20     public void insert(T element){
21         root = insert(root, element);
22     }
23     private BinaryNode<T> insert(BinaryNode<T> root, T element){
24         if(root == null)
25             return new BinaryNode<T>(element);
26         int r = (int)(2*Math.random());
27         //随机地将元素插入到左子树 或者 右子树中
28         if(r==0)
29             root.left = insert(root.left, element);
30         else
31             root.right = insert(root.right, element);
32         return root;
33     }
34
35     /**
36      *
37      * @param k
38      * @return 二叉树中第K层结点的个数(根位于第0层)
39      */
40     public int k_nodes(int k){
41         return k_nodes(root, k);
42     }
43     private int k_nodes(BinaryNode<T> root, int k){
44         if(root == null || k < 0)
45             return 0;
46         if(k == 0)
47             return 1;//根结点
48         else
49             return k_nodes(root.left, k-1) + k_nodes(root.right, k-1);
50     }
51
52     public static void main(String[] args) {
53         BinaryTree<Integer> tree = new BinaryTree<>();
54
55         int[] ele = C2_2_8.algorithm1(4);//构造一个随机数组,数组元素的范围为[1,4]
56         for (int i = 0; i < ele.length; i++) {
57             tree.insert(ele[i]);
58         }
59
60         int k_nodes = tree.k_nodes(2);//第二层
61         int k_nodes2 = tree.k_nodes(-1);//第-1层
62         int k_nodes3 = tree.k_nodes(0);
63         int k_nodes4 = tree.k_nodes(1);
64         int k_nodes5 = tree.k_nodes(4);//若超过了树的高度,结果为0
65         System.out.println(k_nodes);
66         System.out.println(k_nodes2);
67         System.out.println(k_nodes3);
68         System.out.println(k_nodes4);
69         System.out.println(k_nodes5);
70     }
71 }

关于 C2_2_8类,参考:随机序列生成算法---生成前N个整数的一组随机序列

五,参考资料

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

本文转自hapjin博客园博客,原文链接:http://www.cnblogs.com/hapjin/p/5505988.html,如需转载请自行联系原作者

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

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

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

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

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

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

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

  4. 计算二叉树的第k层中所有叶子结点个数

    计算二叉树的第k层中所有叶子结点个数 Time Limit:1000MS Memory Limit:65535K 题型: 编程题 语言: 无限制 描述 二叉链表表示的二叉树:按先序次序输入二叉树中结点 ...

  5. 求二叉树先序序列中第k个结点的值

    typedef struct TreeNode {int data;struct TreeNode* left, *right; }TNode,*BTree;int i = 1; //直接在先序遍历的 ...

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

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

  7. 求二叉树中从根结点到叶子结点的路径

    /** *    实验题目: *        求二叉树中从根结点到叶子结点的路径 *    实验目的: *        掌握二叉树遍历算法的应用,熟练使用先序.中序.后序3种递归 *    和非递 ...

  8. 二叉树题目----4 前序遍历重构二叉树 AND 求二叉树中所有结点的个数

    前序遍历重构二叉树 思路 整个二叉树用数组存储 因为先序遍历它先遍历根,再遍历左,左边没有跑完是不会去遍历右边的,所以遍历左子树,就是数组元素每回向后一个,个数-1 遍历右边时,就是数组起始位置+左子 ...

  9. Java创建二叉树,并使用递归算法求二叉树中叶子结点的数目

    问题描述 创建二叉树,并使用递归算法求二叉树中叶子结点的数目 输入 输入一个用'.'来标明空子树的先根遍历序列,如ABD-EH-CF.I-G- 输出 叶子结点的个数 存储结构 二叉树 算法的基本思想 ...

最新文章

  1. 平均 15189 元!2021 年 3 月程序员工资统计出炉
  2. 数学之美系列十七 -- 谈谈搜索引擎作弊问题(Search Engine Anti-SPAM)
  3. 腾讯天幕——联动生态,共享安全
  4. socketserver 源码浅读
  5. 数据库调优过程(五):物理分表,及写入方案调整
  6. 风雨20年:我所积累的20条编程经验
  7. 20非常有用的Java程序片段(11-15)
  8. Ta 在假笑么?这个识别算法可以鉴定
  9. 首个在线教学中文预训练模型TAL-EduBERT
  10. Flash游戏开发常用函数代
  11. [BZOJ 2154] Crash的数字表格
  12. 数字孪生:第三人称鼠标操作
  13. c语言的0xF9为什么表示1,0xc0(0xc0为什么表示0)
  14. linux环境下解压压缩包失败
  15. 给ESXi虚拟机硬盘瘦身
  16. 闲鱼面试:Thread.sleep(0) 到底有什么用?
  17. 将动画角色导入Unity 3D
  18. layui请求加token_琴海森林 JFinal-layui 文档、资料、学习、API,token验证
  19. 当因为上传文件过大导致上传失败时
  20. 32位程序在64位系统上运行

热门文章

  1. 十二、进程的同步与互斥
  2. AI 八数码A_star算法问题-实验报告
  3. 二值网络--Structured Binary Neural Networks for Accurate Image Classification and Semantic Segmentation
  4. 语义分割--Efficient and Robust Deep Networks for Semantic Segmentation
  5. 【Keras】The added layer must be an instance of class Layer.
  6. cmake通过命令行构建静态库/动态库
  7. linux php mysql安装完整版本_Linux下安装PHP+MySQL+Apache完整版
  8. aws python sdk send sns_AWS:boto3订阅SNS时的空SQS队列
  9. iOS中UIActionSheet使用详解
  10. 清华大佬教你一招最便捷搭建 Zookeeper 的方法!