【面试】基于二叉树层次遍历相关问题的求解
2016-02-23 21:06
363 查看
一、问题描述
1.遍历二叉树指定层次的所有结点
2.统计指定层的搜索结点个数
3.对二叉树进行层次遍历
4.找到二叉树中每一层的第一个结点或最后一个结点
二、问题分析
对树结构的问题我们首先会想到使用递归来解决,因为树结构完美适合递归,树的前序、中序、后序遍历使用递归很容易就可以解决,并且很容易理解。对于树结构的层次遍历则会稍微麻烦一点(当然,也很简单),基于层次遍历的问题也有很多,现在我们就着重来分析前面提到的3个问题。
什么是层次遍历 -- 即按照节点在每一层的顺序从上至下,由左到右进行遍历。
所有的结果都是基于如下的树结构:
View Code
同理,若理解了遍历每层的第一个结点的思路,那么遍历每层的最后一个结点就很简单了。只需要令count == preCount即可。
三、问题总结
对于树结构的相关问题我们首先应该想到的是使用递归来解决,然后思考能不能使用其他方法来解决。感谢各位园友观看,谢谢~
1.遍历二叉树指定层次的所有结点
2.统计指定层的搜索结点个数
3.对二叉树进行层次遍历
4.找到二叉树中每一层的第一个结点或最后一个结点
二、问题分析
对树结构的问题我们首先会想到使用递归来解决,因为树结构完美适合递归,树的前序、中序、后序遍历使用递归很容易就可以解决,并且很容易理解。对于树结构的层次遍历则会稍微麻烦一点(当然,也很简单),基于层次遍历的问题也有很多,现在我们就着重来分析前面提到的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即可。
三、问题总结
对于树结构的相关问题我们首先应该想到的是使用递归来解决,然后思考能不能使用其他方法来解决。感谢各位园友观看,谢谢~