首先为了方便大家记忆,作个解释。
先序(preorder) ,中序(inorder),后序(postorder) 这里指的是根节点的遍历顺序,确切叫先根(先根再左右),中根(先左再根再右),还是(先左后又再根)后根的顺序输出。
定义TreeNode
public class TreeNode{
TreeNode left;
TreeNode right;
int val;
TreeNode(val){
this.val=val;
}
}
1. 先序遍历
- 递归
public void preorder(TreeNode x,List<Integer> ans){
if(x==null) return ;
ans.add(x.val):
preorder(x.left,ans);
preorder(x.right,ans);
}
- 迭代写法,迭代顺序和中序遍历是一样的,只是加入结果的顺序不一样
public void inorder(TreeNode root,List<Integer> ans){
Deque<TreeNode> stack=new ArrayDeque<TreeNode>();
TreeNode cur=root;
while(cur!=null||!stack.isEmpty()){
while(cur!=null){
stack.push(cur);
ans.add(cur.val); //preorder
cur=cur.left;
}
cur=stack.pop();
// ans.add(cur.val); //inorder
cur=cur.right;
}
}
2. 中序遍历
中序遍历的写法主要有两种,一个是递归,一个是迭代的方式。关于二叉树的问题,很多情况下是递归的写法的,但是迭代也是一种换个思路的写法。
- 递归的写法
public void inorder(TreeNode x, List<Integer> ans){
if(x==null) return ;
inorder(x.left,ans);
ans.add(x.val);
inorder(x.right(
}
- 迭代的写法
public void inorder(TreeNode root,List<Integer> ans){
Deque<TreeNode> stack=new ArrayDeque<TreeNode>();
TreeNode cur=root;
while(cur!=null||!stack.isEmpty()){
while(cur!=null){
stack.push(cur);
cur=cur.left;
}
cur=stack.pop();
ans.add(cur.val);
cur=cur.right;
}
}
3. 后序遍历
- 递归写法
public void postorder(TreeNode x, List<Integer> ans){
if(x==null) return ;
postorder(x.left,ans);
postorder(x.right,ans);
ans.add(x.val);
return
}