leetcode144_145_94_二叉树的遍历(iteration版)

之前介绍了二叉树三种遍历方式的recursion版本,现在使用iteration版本。
模板中最重要的就是:1.只有不是null的节点才能入栈2.如果null入栈了,说明它的栈下一个节点还没有处理过(加入结果集)
https://programmercarl.com/二叉树的统一迭代法.html#迭代法中序遍历

模板

public List<Integer> inorderTraversal(TreeNode root) {
    List<Integer> list = new ArrayList<Integer>();
    Stack<TreeNode> stack = new Stack();
    if(root == null) return list;
    else stack.push(root);
    while(!stack.isEmpty()) {
        TreeNode node = stack.pop();
        if(node != null) {
            // 根据需要的序列将节点入栈,其中:1.只有非空节点才能入栈2.如果空节点入栈了,那是为了提示还没有加入结果集合。
        }
        else {
            TreeNode treeNode = stack.pop();
            list.add(treeNode.val);
        }
    }
    return list;
}

leetcode144 二叉树前序遍历

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

leetcode145 二叉树后序遍历

public List<Integer> postorderTraversal(TreeNode root) {
    List<Integer> list = new ArrayList<Integer>();
    Stack<TreeNode> stack = new Stack<TreeNode>();
    if(root != null) stack.push(root);
    else return list;
    while(!stack.isEmpty()) {
        TreeNode treeNode = stack.pop();
        if(treeNode != null) {
            // l r m
            stack.push(treeNode);
            stack.push(null);
            if(treeNode.right != null) stack.push(treeNode.right);
            if(treeNode.left != null) stack.push(treeNode.left);
        }
        else {
            TreeNode node = stack.pop();
            list.add(node.val);
        }
    }
    return list;
}

leetcode94 二叉树中序遍历

public List<Integer> inorderTraversal(TreeNode root) {
    List<Integer> list = new ArrayList<Integer>();
    Stack<TreeNode> stack = new Stack();
    if(root == null) return list;
    else stack.push(root);
    while(!stack.isEmpty()) {
        TreeNode node = stack.pop();
        if(node != null) {
            if(node.right != null) stack.push(node.right);

            stack.push(node);
            stack.push(null);

            if(node.left != null) stack.push(node.left);
        }
        else {
            TreeNode treeNode = stack.pop();
            list.add(treeNode.val);
        }
    }
    return list;
}
posted @ 2022-02-14 13:34  明卿册  阅读(33)  评论(0)    收藏  举报