leetcode:N叉树的层序遍历(二)

1,710 阅读1分钟

题目:

给定一个 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()); //逐个输出数组元素的值 }