1.前序
递归
public List preorderTraversal(TreeNode root) {
List list=new ArrayList();
if(root!=null){
list.add(root.val);
list.addAll(preorderTraversal(root.left));
list.addAll(preorderTraversal(root.right));
}
return list;
}迭代
public List preorderTraversal(TreeNode root) {
List list=new ArrayList();
Stack s=new Stack<>();
TreeNode top=root;
while(top!=null || !s.isEmpty()){
while(top!=null){
list.add(top.val);
s.push(top);
top=top.left;
}
top=s.pop();
top=top.right;
}
return list;
}
2.中序
递归
public List inorderTraversal(TreeNode root) {
List list=new ArrayList();
if(root!=null){
list.addAll(inorderTraversal(root.left));
list.add(root.val);
list.addAll(inorderTraversal(root.right));
}
return list;
}
迭代:
public List inorderTraversal(TreeNode root) {
List list=new ArrayList();
Stack s=new Stack<>();
TreeNode top=root;
while(top!=null || !s.isEmpty()){
while(top!=null){
s.push(top);
top=top.left;
}
top=s.pop();
list.add(top.val);
top=top.right;
}
return list;
}
3.后序
递归:
List list=new ArrayList();
postorderTraversal(TreeNode root) {
if(root!=null){
postorderTraversal(root.left);
postorderTraversal(root.right);
list.add(root.val); }
return list;
}
迭代:
后序的迭代比较麻烦,输出的条件是
1.此节点是叶子节点。
2.此节点的叶子节点都已经输出
所以用一个pre节点保存上一次访问的节点。
public List postorderTraversal(TreeNode root) {
List list=new ArrayList();
if(root==null)
return list;
Stack s=new Stack<>();
s.push(root);
TreeNode top,pre=null;
while(!s.isEmpty()){
top=s.peek();
if((top.left==null && top.right==null ) || (pre!=null && (top.left==pre || top.right==pre))){
list.add(top.val);
s.pop();
}else{
if(top.right!=null){
s.push(top.right);
}
if(top.left!=null){
s.push(top.left);
}
}
pre=top;
}
return list;
}