二叉树统一迭代遍历

93 阅读1分钟

1. 前序遍历

class Solution {
    public List<Integer> preorderTraversal(TreeNode root) {
        ArrayList<Integer> result = new ArrayList<>();
        preOrder(root, result);
        return result;
    }
    public void preOrder(TreeNode root, ArrayList<Integer> result) {
        if (root == null) return;
        Stack<TreeNode> stack = new Stack<TreeNode>();
        stack.push(root);
        while(!stack.isEmpty()) {
            TreeNode node = stack.peek();
            if(node != null) {
                stack.pop(); //避免重复加入,弹出该节点 根据栈特点,依次添加右左中节点
                if (node.right != null) stack.push(node.right); //添加右节点
                if (node.left != null) stack.push(node.left); //添加左节点
                stack.push(node); //添加中节点
                stack.push(null); //打标记
            }else {
                stack.pop(); //弹出空节点
                node = stack.peek(); //取出节点
                stack.pop();
                result.add(node.val); //添加结果集
            }

        }
    }
 }

2. 中序遍历

class Solution {
    public List<Integer> inorderTraversal(TreeNode root) {
        ArrayList<Integer> result = new ArrayList<>();
        preOrder(root, result);
        return result;
    }
    public void preOrder(TreeNode root, ArrayList<Integer> result) {
        //利用栈模拟二叉树中序遍历
        if (root == null) return;
        Stack<TreeNode> stack = new Stack<TreeNode>();
        stack.push(root);
        while(!stack.isEmpty()) {
            TreeNode node = stack.peek();
            if (node != null) {
                stack.pop(); //避免重复加入,弹出该节点 根据栈特点,依次添加右中左节点
                if (node.right != null) stack.push(node.right); //添加右节点
                stack.push(node); //添加中节点
                stack.push(null); //打标记
                if (node.left != null) stack.push(node.left); //添加左节点
            }else {
                stack.pop(); //弹出空节点
                node = stack.peek(); // 取出节点
                stack.pop();
                result.add(node.val); //添加结果集
            }
        }
    }
}

3. 后序遍历

class Solution {
    public List<Integer> postorderTraversal(TreeNode root) {
        ArrayList<Integer> result = new ArrayList<>();
        preOrder(root, result);
        return result;
    }
    public void preOrder(TreeNode root, ArrayList<Integer> result) {
        if (root == null) return;
        Stack<TreeNode> stack = new Stack<TreeNode>();
        stack.push(root);
        while(!stack.isEmpty()) {
            TreeNode node = stack.peek();
            if (node != null) {
                stack.pop(); //避免重复加入,弹出该节点 根据栈特点,依次添加中右左节点
                stack.push(node); //添加中节点
                stack.push(null); //打标记
                if (node.right != null) stack.push(node.right); //添加右节点
                if (node.left != null) stack.push(node.left); //添加左节点
            }else {
                stack.pop(); //弹出空节点
                node = stack.peek(); //取出节点
                stack.pop(); 
                result.add(node.val); //添加结果集
            }
        }
    }
}