二叉树-前,中,后序遍历(JAVA代码实现-迭代
前序遍历:先访问根节点,再递归遍历左子树,再递归遍历右子树
//根->左->右
public List<Integer> postorderTraversal(TreeNode root){
//定义一个列表用来接收遍历结果
List<Integer> res=new ArrayList<Integer>();
if(root==null){
return res;
}
//定义一个栈用来辅助遍历
Deque<TreeNode> stack=new LinkedList<TreeNode>();
//定义一个指针 指向根节点
TreeNode node=root;
//循环条件 栈不为空或当前节点不为空
while(!stack.isEmpty()||node!=null){
while(node!=null){
res.add(node.val);//将根节点添加到res中
stack.push(node);
node=node.left;//开始遍历左子树
}
//当前节点为空时,从栈中弹出一个节点
node=stack.pop();
//移动到栈顶节点的右子节点
node=node.right;
}
return res;
}
中序遍历:先递归左子树,再访问根结点,再递归右子树
//左->根->右
public List<Integer> preorderTraversal(TreeNode root){
List<Integer> res=new ArrayList<Integer>();
if(root==null){
return res;
}
Deque<TreeNode> stack=new LinkedList<TreeNode>();
TreeNode node=root;
while(!stack.isEmpty()||node!==null){
while(node!=null){
stack.push(node);
node=node.left;
}
node=stack.pop();
res.add(node.val);
node=node.right;
}
return res;
}
后序遍历:先递归左子树,再递归右子树,最后根节点
//左->右->根
public List<Integer> postorderTraversal(TreeNode root){
List<Integer> res=new ArrayList<>();
if(root==null){
return res;
}
Deque<TreeNode> stack=new LinkedList<>();
TreeNode prev=null;//用于记录上一个被访问的节点
while(root!=null||!stack.isEmpty()){
while(root!=null){
stack.push(root);
root=root.left;
}
TreeNode peekNode=stack.peek();//获取栈顶元素但不弹出
//如果当前节点的右子树为空或者已经访问过,则可以访问当前节点
if(peekNode.right==null||peekNode.right==prev){
stack.pop();//弹出当前节点
res.add(peekNode.val);//
prev=peekNode;//更新prev
}else{
//否则,继续遍历右子树
root=peekNode.right;
}
有种简单的实现方式-递归
public List<Integer> inorderTraversal(TreeNode root){
List<Integer>res = new ArrayList<Integer>();
inorder(root,res);
return res;
}
public void inorder(TreeNode root,List<Integer> res){
if(root==null){
return
}
inorder(root.left,res);
res.add(root.val);
inorder(root.right,res)
}
