二叉树的三种递归方式(前序遍历,中序遍历,后序遍历)
使用非递归方法完成(迭代)
思路说明
1. 先序遍历:根左右
类似与层序遍历,要使用到栈;先把根节点入栈,循环取顶点元素,之后访问;把当前节点的右子树入栈,再把当前节点的左子树入栈(栈是后进先出的),当栈为空时,遍历完成。
2.中序遍历:左根右
使用栈,先从树的根节点一直循环往左找,直到找到null,路径上遇见的节点分别入栈;取栈顶元素并访问;之后从当前栈顶元素的右子树出发,循环上面的过程
3.后序遍历:左右根
使用栈,先从树的根节点一直循环往左找,直到找到null,路径上遇见的节点分别入栈;取栈顶元素(不一定能访问),此刻用peek来查看,如果栈顶元素的右子树为空,或者右子树已经访问过了,这样的话才可以访问栈顶元素。
右子树是否访问过是判断当前栈顶元素的右子节点和prev是否相等,prev是记录下后序遍历过程最后的一个被访问到的元素。
代码
前序遍历
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
//二叉树的前序遍历(迭代方法)
class Solution {
public List<Integer> preorderTraversal(TreeNode root) {
List<Integer> res=new ArrayList<>();
if(root==null){
return res;
}
Stack<TreeNode> stack=new Stack<>();
stack.push(root);
while(!stack.isEmpty()){
TreeNode top=stack.pop();
res.add(top.val);
if(top.right!=null){
stack.push(top.right);
}
if(top.left!=null){
stack.push(top.left);
}
}
return res;
}
}
中序遍历
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
//二叉树的中序遍历(迭代方法)
class Solution {
public List<Integer> inorderTraversal(TreeNode root) {
List<Integer> res=new ArrayList<>();
if(root==null){
return res;
}
Stack<TreeNode> stack=new Stack<>();
TreeNode cur=root;
while(true){
//先把左边的循环入栈
while(cur!=null){
stack.push(cur);
cur=cur.left;
}
if(stack.isEmpty()){
break;
}
TreeNode top=stack.pop();
res.add(top.val);
cur=top.right;
}
return res;
}
}
后序遍历
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public List<Integer> postorderTraversal(TreeNode root) {
List<Integer> res=new ArrayList<>();
if(root==null){
return res;
}
Stack<TreeNode> stack=new Stack<>();
TreeNode cur=root;
TreeNode prev=null;
while(true){
while(cur!=null){
stack.push(cur);
cur=cur.left;
}
if(stack.isEmpty()){
break;
}
TreeNode top=stack.peek();
if(top.right==null||top.right==prev){
res.add(top.val);
stack.pop();
prev=top;
}else{
cur=top.right;
}
}
return res;
}
}