题目:
给定一个 N 叉树,返回其节点值的
层序遍历(即从左到右,逐层遍历)。
树的序列化输入是用层序遍历,每组子节点都由 null 值分隔(参见示例)。
// Definition for a Node.class Node {public: int val; vector<Node*> children; Node() {} Node(int _val) { val = _val; } Node(int _val, vector<Node*> _children) { val = _val; children = _children; }};class Solution {public: vector<vector<int>> levelOrder(Node* root) { }};
题解:
List<Integer> values = new ArrayList<>();
Queue<Node> queue = new LinkedList<>();
queue.add(root);
while (!queue.isEmpty()) {
Node nextNode = queue.remove();
values.add(nextNode.val);
for (Node child : nextNode.children) {
queue.add(child);
}
}
行应该按从上到下的顺序排列。 因为我们从根节点开始遍历树,然后向下搜索最接近根节点的节点,这是广度优先搜索。我们使用队列来进行广度优先搜索,队列具有先进先出的特性。 在这里使用栈是错误的选择,栈应用于深度优先搜索。 让我们在树上使用基于队列的遍历算法,看看它的作用。这是你应该记住的一个基本算法。
queue:用来进行排序的队列,先进先出,存的是node
values:用来进行层序遍历的记录,存的是integer,存的是数值
vector的作用:
Node是一个自定bai义的类(class)
vector 代表的du是一个容器,可以zhi放任何自定义的类,dao和数组相zhuan似,但又不同.
vector ans含义就是定义了一个容器的对象叫做 ans,这个容器可以放Node实体。
vector 常用的功能:
Node tmp;
ans.push_back(tmp); //放入一个实体,放到后面
for(int i=0;i<ans.size();i++) { //枚举实体
tmp=ans[i];
}
tmp = ans.back(); //最后一个实体,相当于 tmp = ans[ans.size()-1];
ans.pop_back();//从后面弹出一个实体
队列的操作:
Queue 中 remove() 和 poll()都是用来从队列头部删除一个元素。
在队列元素为空的情况下,remove() 方法会抛出NoSuchElementException异常,poll() 方法只会返回 null 。
for(元素类型t 元素变量x : 遍历对象obj)
这种有冒号的for循环叫做foreach循环,foreach语句是java5的新特征之一,在遍历数组、集合方面,foreach为开发人员提供了极大的方便。foreach语句是for语句的特殊简化版本,但是foreach语句并不能完全取代for语句,然而,任何的foreach语句都可以改写为for语句版本。foreach并不是一个关键字,习惯上将这种特殊的for语句格式称之为“foreach”语句。从英文字面意思理解foreach也就是“for 每一个”的意思。实际上也就是这个意思。foreach的语句格式: for(元素类型t 元素变量x : 遍历对象obj){ 引用了x的java语句; }
示例代码:
List<String> list = new ArrayList<String>(); list.add("1"); list.add("2"); list.add("3"); for (String x : list) { System.out.println(x); } Object s[] = list.toArray(); for (Object x : s) { System.out.println(x.toString()); //逐个输出数组元素的值 }