二叉树的迭代遍历

leetcode题目链接
节点类
package cn.edu.zut;
/**
 * @Classname TreeNode
 * @Author jdq8576
 * @Date 2019/6/3 8:41
 **/
public class TreeNode {
    int val;
    TreeNode left;
    TreeNode right;
    TreeNode(int val){
        this.val = val;
    }
}
中序遍历
  • 遇到一个结点,就把它压入栈,并去遍历它的左子树
  • 当左子树遍历结束后,从栈顶弹出这个结点并访问它
  • 然后按其右指针再去中序遍历该节点的右子树
public List<Integer> inorderTraversal(TreeNode root) {
        if(root==null){
            return new ArrayList<>();
        }else{
            Stack<TreeNode> stack = new Stack<>();
            List<Integer> list = new ArrayList<>();
            while (root!=null||!stack.isEmpty()){
                while (root!=null){// 一路向左把沿途结点压入栈
                    stack.push(root);
                    root = root.left;
                }
                if(!stack.isEmpty()){
                    root = stack.pop();// 弹出栈
                    list.add(root.val);
                    root = root.right;// 转向右节点
                }
            }
            return list;
        }
    }
先序遍历

先把根节点的值添加到list里面,然后依次入栈右子树,左子树(顺序不能错)。这样首先出栈的才是左子树。

public List<Integer> preorderTraversal(TreeNode root){
        if(root==null){
            return new ArrayList<>();
        }else{
            List<Integer> list = new ArrayList<>();
            Stack<TreeNode> stack = new Stack<>();
            stack.push(root);
            while (!stack.isEmpty()){
                TreeNode tmp = stack.pop();
                list.add(tmp.val);
                if(tmp.right!=null)
                    stack.push(tmp.right);
                if(tmp.left!=null)
                    stack.push(tmp.left);
            }
            return list;
        }
    }
后序遍历

后序遍历比较复杂,但是看见网上有个比较好记住的办法:按照与前序相似的方法(前序压栈的顺序是先右后左,这里是先左后右),先得到一个结果,然后对结果倒序一下,就可以了。

public class postorderTraversal {
    public List<Integer> postorderTreversal(TreeNode root){
        if(root == null){
            return new ArrayList<>();
        }
        else{
            List<Integer> list = new ArrayList<>();
            Stack<TreeNode> stack = new Stack<>();
            stack.push(root);
            while (!stack.isEmpty()){
                TreeNode tmp = stack.pop();
                list.add(tmp.val);
                if(tmp.left!=null){
                    stack.push(tmp.left);
                }
                if(tmp.right!=null){
                    stack.push(tmp.right);
                }
            }
            Collections.reverse(list);
            return list;
        }
    }
}

猜你喜欢

转载自blog.csdn.net/jdq8576/article/details/90746637