leetcode传送门:传送门
本来是前几天同学问的一个面试题,好久不做有点懵逼,今天想起来了做一下,其实就是二叉树层次遍历,只不过要检测一下每一层的结尾,我刚开始想的是记录一下最后一个元素的右子树的值,没有右子树,记录左子树,不过可能会存在这样的树
所以说要换种方法,其实就不用换,层次遍历的话就是在当前节点的基础上进行广度优先搜索,如果每次都移除掉队首元素的话,队列中元素的个数就是当前层次的元素个数,逐步解释可能更清晰
- 首次将A加入队列,则当前层次总数为1
- 取出队首节点A,搜索周遭节点,加入节点BC
- 队列元素只有BC,则这一层只有BC,依次取出BC,在搜索BC周遭节点,加入DE
- 队列元素只有DE,确认这一层只有两个元素DE
代码如下
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>> result = new ArrayList<List<Integer>>();
if(root==null) {
return result;
}
LinkedList<TreeNode> unUseNodes = new LinkedList<TreeNode>();
unUseNodes.addLast(root);
while(unUseNodes.size()>0) {
int nowSize = unUseNodes.size();
ArrayList<Integer> list = new ArrayList<Integer>();
for(int i = 0; i < nowSize; i++) {
TreeNode now = unUseNodes.removeFirst();
list.add(now.val);
if(now.left!=null) {
unUseNodes.addLast(now.left);
}
if(now.right!=null) {
unUseNodes.addLast(now.right);
}
}
result.add(list);
}
return result;
}
}
同学原先问的问题是,给定一棵二叉树,求二叉树从右边看去,看到的元素的值,其实就是问的一棵二叉树层次遍历以后每一行的最后一个元素