1. 數據結構
class Node {
public int val;
public List<Node> children;
public Node() {
}
public Node(int _val, List<Node> _children) {
val = _val;
children = _children;
}
}
2. 前序遍歷
遞歸實現:
class Solution {
public List<Integer> preorder(Node root) {
List<Integer> res = new ArrayList<>();
helper(root, res);
return res;
}
private void helper(Node root, List<Integer> res) {
if (root == null) {
return;
}
res.add(root.val);
for (Node node : root.children) {
helper(node, res);
}
}
}
迭代實現:
class Solution {
public List<Integer> preorder(Node root) {
if (root == null) {
return new ArrayList<>();
}
List<Integer> res = new ArrayList<>();
Stack<Node> stk = new Stack<>();
stk.push(root);
while (!stk.isEmpty()) {
Node node = stk.pop();
res.add(node.val);
for (int i = node.children.size() - 1; i >= 0; i--) {
stk.push(node.children.get(i));
}
}
return res;
}
}
3. 後序遍歷
遞歸實現:
class Solution {
public List<Integer> postorder(Node root) {
List<Integer> res = new ArrayList<>();
helper(root, res);
return res;
}
private void helper(Node root, List<Integer> res) {
if (root == null) {
return;
}
for (Node node : root.children) {
helper(node, res);
}
res.add(root.val);
}
}
迭代實現:
class Solution {
public List<Integer> postorder(Node root) {
if (root == null) {
return new ArrayList<>();
}
List<Integer> res = new ArrayList<>();
Stack<Node> stk = new Stack<>();
stk.push(root);
while (!stk.isEmpty()) {
Node node = stk.pop();
res.add(node.val);
for (int i = 0; i < node.children.size(); i++) {
stk.push(node.children.get(i));
}
}
Collections.reverse(res);
return res;
}
}
4. 層序遍歷
遞歸實現:
class Solution {
public List<List<Integer>> levelOrder(Node root) {
List<List<Integer>> res = new ArrayList<>();
helper(root, 0, res);
return res;
}
private void helper(Node root, int level, List<List<Integer>> res) {
if (root == null) {
return;
}
if (level == res.size()) {
res.add(new ArrayList<>());
}
res.get(level).add(root.val);
for (Node node : root.children) {
helper(node, level + 1, res);
}
}
}
迭代實現:
class Solution {
public List<List<Integer>> levelOrder(Node root) {
if (root == null) {
return new ArrayList<>();
}
List<List<Integer>> res = new ArrayList<>();
Queue<Node> queue = new LinkedList<>();
queue.add(root);
while (!queue.isEmpty()) {
int n = queue.size();
List<Integer> ans = new ArrayList<>();
for (int i = 0; i < n; i++) {
Node node = queue.remove();
ans.add(node.val);
for (int j = 0; j < node.children.size(); j++) {
queue.add(node.children.get(j));
}
}
res.add(ans);
}
return res;
}
}