原題
Given a binary tree, return the preorder traversal of its nodes' values.
For example:
Given binary tree [1,null,2,3]
,
1 \ 2 / 3
return [1,2,3]
.
Note: Recursive solution is trivial, could you do it iteratively?
递歸很簡單,先add根節點數,然後递歸左節點和右節點就可以了。迭代則比較複雜,我定義了一個類,用來記錄哪個點已被左或右遍歷過,然後把遍歷中的點都push進棧中。當一個點左右均已遍歷過,或無左右節點,則pop出棧。
代碼
递歸版
import java.util.*;
class Solution {
static List<Integer> list;
public List<Integer> preorderTraversal(TreeNode root) {
list = new LinkedList<Integer>();
loop(root);
return list;
}
void loop(TreeNode root) {
if (root != null) {
list.add(root.val);
loop(root.left);
loop(root.right);
}
}
}
迭代版
import java.util.*;
class Solution {
static List<Integer> list;
static Stack<Node> stack;
public List<Integer> preorderTraversal(TreeNode root) {
list = new LinkedList<Integer>();
stack = new Stack<Node>();
if (root != null) {
list.add(root.val);
Node n = new Node(root);
stack.push(n);
while (!stack.isEmpty()) {
n = stack.peek();
if (n.left == false && n.node.left != null) {
list.add(n.node.left.val);
Node temp = new Node(n.node.left);
stack.push(temp);
n.left = true;
}
else if (n.right == false && n.node.right != null) {
list.add(n.node.right.val);
Node temp = new Node(n.node.right);
stack.push(temp);
n.right = true;
}
else {
stack.pop();
}
}
}
return list;
}
}
class Node {
TreeNode node;
boolean left;
boolean right;
public Node (TreeNode n) {
node = n;
left = false;
right = false;
}
}
感想
一開始沒看清題目,以為直接递歸就好了,寫完才看到題目建議用迭代,就又寫了個迭代版的。迭代真的是比递歸複雜好多,沒递歸那個直觀易懂,要考虑很多情況。