一、问题描述

  1.遍历二叉树指定层次的所有结点

  2.统计指定层的搜索结点个数

  3.对二叉树进行层次遍历

  4.找到二叉树中每一层的第一个结点或最后一个结点

二、问题分析

  对树结构的问题我们首先会想到使用递归来解决,因为树结构完美适合递归,树的前序、中序、后序遍历使用递归很容易就可以解决,并且很容易理解。对于树结构的层次遍历则会稍微麻烦一点(当然,也很简单),基于层次遍历的问题也有很多,现在我们就着重来分析前面提到的3个问题。

  什么是层次遍历 -- 即按照节点在每一层的顺序从上至下,由左到右进行遍历。

  所有的结果都是基于如下的树结构:

  

  树的数据结构的具体代码如下:

class Node {private String data;private Node lChild;private Node rChild;public Node(String data) {this.data = data;}public Node(String data, Node lChild, Node rChild) {this.data = data;this.lChild = lChild;this.rChild = rChild;}public Node getLChild() {return lChild;}public Node getRChild() {return rChild;}public void setRChild(Node rChild) {this.rChild = rChild;}public void setLChild(Node lChild) {this.lChild = lChild;}@Overridepublic String toString() {return data;}
}

View Code

  问题1分析 -- 如何遍历二叉树指定层次的所有结点?首先,我们考虑能不能使用递归进行遍历,因为树问题太适合用递归解决了,假定我们的函数名为traverseLevel,我们至少能够确定函数的参数应该会有树的根节点root,然后,仅仅只有这个参数还不足以解决问题,再添加一个int型的level参数,通过这两个参数能否解决问题呢?我们发现确实可以解决问题的。具体代码如下(其中树的数据结构需要自己建立,只给出了递归的核心代码):

public void traverseLevel(Node root, int level) {if(null == root)return;if (1 == level) { // 表示到达指定层
        System.out.println(root.data);} else {traverseLevel(root.lChild, level - 1);traverseLevel(root.rChild, level - 1);}
}

View Code

  问题2分析 -- 基于问题1,我们已经可以遍历树的指定层,现在我们要统计指定层的所有结点个数,只需要简单的修改问题1中的代码即可,具体的代码如下:

public int levelNodeCount(Node root, int level) {if(null == root)return 0;if (1 == level) { // 表示到达指定层
        System.out.println(root.data);return 1;} else {return levelNodeCount(root.lChild, level - 1)+ levelNodeCount(root.rChild, level - 1);            }
}      

View Code

  问题3分析 -- 基于问题1的分析,我们可以进一步求解问题3,既然我们可以遍历指定层的所有结点,那么遍历按照层次结构遍历整棵树就只需要依次遍历第一层,第二层...最后一层(n)。
这时,我们只需要求出树有多少层,即n的大小(树的高度)即可解决整个问题。求解树的高度我们也可以采拥递归的方法来进行,具体代码如下:

public int treeHeight(Node root) {if (null == root)return 0;int lHeight = treeHeight(root.lChild);int rHeight = treeHeight(root.rChild);int max = -1;if (lHeight > rHeight)max = lHeight;else max = rHeight;return max + 1;
}

View Code

既然求得了树的高度,那么问题2也就迎刃而解了,具体代码如下:

for (int i = 1; i <= treeHeight(root); i++) {traverseLevel(root, i);
}

View Code

  继续问题3分析 -- 如果我们不采拥递归的方法来解决,而使用队列的方式进行求解,可以得到如下的代码:

public static void levelOrder(Node root) {Queue<Node> queue = new LinkedList<Node>();if (null != root) {if (null != root.lChild)queue.offer(root.lChild);if (null != root.rChild) {queue.offer(root.rChild);}System.out.println(root.data);while (!queue.isEmpty()) {Node node = queue.poll();System.out.println(node.data);if (null != node.lChild) {queue.offer(node.lChild);} if (null != node.rChild) {queue.offer(node.rChild);}}}
}

View Code

  问题4分析 -- 有了解决问题1、问题2和问题3的基础,解决问题3也会容易很多,首先我们需要知道每一层的节点个数,然后使用一个计数器递增,当达到每一层的第一个结点时,进行遍历操作即可,具体代码如下:

public static void printFirstNodeOfEachLevel(Node root) {Queue<Node> queue = new LinkedList<Node>();int preCount = 0;int levelNodeCount = 0;if (null != root) {System.out.println(root.data);if (null != root.lChild) {queue.offer(root.lChild);levelNodeCount++;}if (null != root.rChild) {queue.offer(root.rChild);levelNodeCount++;}int count = 0;preCount = levelNodeCount;levelNodeCount = 0;while (!queue.isEmpty()) {Node node = queue.poll();count++;if (count == 1) {System.out.println(node.data);}if (null != node.lChild) {queue.offer(node.lChild);levelNodeCount++;} if (null != node.rChild) {queue.offer(node.rChild);levelNodeCount++;}if (count == preCount) { // 已经到了本层的最后一个结点            count = 0;preCount = levelNodeCount;levelNodeCount = 0;}}}
}

View Code

  同理,若理解了遍历每层的第一个结点的思路,那么遍历每层的最后一个结点就很简单了。只需要令count == preCount即可。

三、问题总结

  对于树结构的相关问题我们首先应该想到的是使用递归来解决,然后思考能不能使用其他方法来解决。感谢各位园友观看,谢谢~

【面试】基于二叉树层次遍历相关问题的求解相关推荐

  1. 由序列确定二叉树:前序序列和中序序列构造二叉树 后序序列和中序序列构造二叉树 层次遍历序列和中序遍历序列构造二叉树 代码实现(c语言)

    下面三种序列可以唯一的构造唯一的一棵二叉树: 前序序列和中序序列构造二叉树 后序序列和中序序列构造二叉树 层次遍历序列和中序遍历序列构造二叉树 #include<stdio.h> #inc ...

  2. 二叉树层次遍历:队列

    二叉树层次遍历 二叉树层次遍历的基本算法在本文中不提及.本文内容为,在二叉树层次遍历中,为何选用队列这样一种数据结构. 不使用额外数据结构 首先,假设我们不使用额外的数据结构,只使用 1 个指针: 访 ...

  3. [LeetCode] Binary Tree Level Order Traversal 二叉树层次遍历(DFS | BFS)

    目录: 1.Binary Tree Level Order Traversal - 二叉树层次遍历 BFS 2.Binary Tree Level Order Traversal II - 二叉树层次 ...

  4. 数据结构-二叉树层次遍历

    首先介绍下二叉树的层次遍历即按照顺序对树节点依次访问,如下图: 顺序遍历的结果为:ABCDEFGHIJK 我们可以借助一个队列来实现二叉树的层次遍历:思路如下: 先将二叉树根节点入队,然后出队,访问该 ...

  5. 二叉树层次遍历--广度遍历和深度遍历

    问题来源:二叉树层次遍历 问题描述:给定一个二叉树,返回其按层次遍历的节点值. (即逐层地,从左到右访问所有节点). 例子: 给定二叉树: [3,9,20,null,null,15,7], 3/ \9 ...

  6. 树(二叉树层次遍历输出及二叉树前序遍历输入)

    前两篇解释了二叉树的有关逻辑概念及前中后序输出递归代码的实现,这篇将讲述二叉树层次遍历输出如何实现以及二叉树前序遍历输入的两种情况. 定义结构体 struct BiNode{char data;BiN ...

  7. (数据结构)二叉树层次遍历

    二叉树层次遍历 二叉树层次遍历的实现思想是:通过队列数据结构,从树的根结点开始,依次将其左孩子和右孩子入队:而后每次队列中一个结点出队,都将其左孩子和右孩子入队,直到树中所有结点都出队,出队结点的先后 ...

  8. 二叉树的层次遍历_【腾讯面试热身题】二叉树层次遍历(动画展示)

    二叉树的层次遍历同时涉及到树和队列两种数据结构的操作,因此大厂很喜欢用来作为面试的热身题.作者不少去腾讯的小伙伴,都反映,这种题一定要非常熟练,不然会被直接pass. 1 题目描述 给定一个二叉树,按 ...

  9. 二叉树层次遍历c语言_[LeetCode] 107. 二叉树的层次遍历 II

    题目链接 : https://leetcode-cn.com/problems/binary-tree-level-order-traversal-ii/ 题目描述: 给定一个二叉树,返回其节点值自底 ...

  10. 二叉树层次遍历python_根据二叉树层序遍历顺序(数组),将其转换为二叉树(Python)...

    1.创建二叉树结点和值 class Node: def __init__(self, value): self.value = value self.left = None self.right = ...

最新文章

  1. node.js发送邮件
  2. 使用Jquery插件jsonview来展示json数据
  3. JAVA——RSA加密与解密
  4. Mysql 死锁过程及案例详解之插入意向锁与自增锁备份锁日志锁Insert Intention Lock Auto-increment Lock Backup Lock Log Lock
  5. Leecode20. 有效的括号——Leecode大厂热题100道系列
  6. linux之awk命令学习笔记
  7. rs.open select * from bbs,conn,1,1 参数说明
  8. 太吾绘卷第一世攻略_育劳 | 花菜小当家,巧克力蛋糕卷的出道秘籍
  9. php怎么遍历json字符串数组,php-使用jquery遍历json数组
  10. 命名空间“System.Web”中不存在类型或命名空间名称“Optimization”解决方法
  11. 2020-02-16 Git客户端下载
  12. Excel-散点图(相关性及数据分布)分析
  13. SpringBoot整合Mybatis出现的错误:At least one base package must be specified
  14. 节气丨大雪至,人间至此雪盛时,岁暮天寒,顺问冬安
  15. 视频教程-视频打包为MP4格式并存储到TF卡的实现-第7/11季-嵌入式
  16. 算法题-排列组合问题
  17. 网络聊天程序的设计与实现
  18. 百度工程师带你探秘C++内存管理(ptmalloc篇)
  19. 人民路婚纱店入驻华盛街
  20. 以太坊合并后,矿工们要失业了吗?

热门文章

  1. 去除 火狐浏览器自动给域名前加 www.
  2. 转载:相同版本的JVM和Java应用,在 x86 和AArch64 平台性能相差30%
  3. 你不能强迫别人进步,跟别人没法强迫你进步一样
  4. cygwin/msys: fatal error LNK1104: 无法打开文件“kernel32.lib”
  5. 解决办法:无法解析的外部符号 __imp_RegCloseKey
  6. SHEL脚本中调用另外一个脚本的函数和变量
  7. 以自己范例,说明如何写操作文档
  8. MS OFFICE在LINUX上的视觉效果跟WINDOWS相差太大
  9. 安卓打开本应用的应用信息界面的代码
  10. 华为手机打开日志输出的几种方法