Given a binary tree, return the preorder traversal of its nodes' values.
For example:
Given binary tree {1,#,2,3}
,
1 \ 2 / 3
return [1,2,3]
.
Note: Recursive solution is trivial, could you do it iteratively?
和in-order相比输出位置变一下即可
public class Solution {
public List<Integer> preorderTraversal(TreeNode root) {
List<Integer> ans = new ArrayList<>();
Stack<TreeNode> stack = new Stack<>();
TreeNode cur = root;
while(cur!=null || !stack.empty()){
while(cur!=null){
stack.push(cur);
ans.add(cur.val);
cur = cur.left;
}
cur = stack.pop();
cur = cur.right;
}
return ans;
}
}
这个过程可以只把右节点放在stack当中
public List<Integer> preorderTraversal(TreeNode node) {
List<Integer> list = new LinkedList<Integer>();
Stack<TreeNode> rights = new Stack<TreeNode>();
while(node != null) {
list.add(node.val);
if (node.right != null) {
rights.push(node.right);
}
node = node.left;
if (node == null && !rights.isEmpty()) {
node = rights.pop();
}
}
return list;
}
Morris方法在输出的位置要调整一个地方
public class Solution {
public List<Integer> preorderTraversal(TreeNode root) {
List<Integer> ans = new ArrayList<>();
TreeNode cur=root, pre=null;
while(cur!=null){
if(cur.left==null){
ans.add(cur.val);
cur = cur.right;
}else{
pre = cur.left;
while(pre.right!=null && pre.right!=cur){
pre = pre.right;
}
if(pre.right==null){
pre.right = cur;
ans.add(cur.val);
cur = cur.left;
}else{
pre.right = null;
cur = cur.right;
}
}
}
return ans;
}
}