二叉树遍历

二叉树遍历非递归实现

目录

二叉树遍历非递归实现

树节点定义:

先序遍历:

中序遍历:

后序遍历:

测试代码:

先序遍历测试代码:

中序遍历测试代码:

后序遍历测试代码:


树节点定义:

java 复制代码
public class TreeNode {
    int val;
    TreeNode left;
    TreeNode right;
    TreeNode() {}
    TreeNode(int val) { this.val = val; }
    TreeNode(int val, TreeNode left, TreeNode right) {
    this.val = val;
    this.left = left;
    this.right = right;
    }
}

先序遍历:

java 复制代码
    /**
     * 前序遍历二叉树
     * @param root
     * @return
     */
    public List<Integer> preorderTraversal(TreeNode root) {
        Stack<TreeNode> stack = new Stack<>();
        List<Integer> list = new LinkedList<>();
        while (root != null || !stack.isEmpty()) {
            if (root != null) {
                // 先访问根节点
                list.add(root.val);
                stack.push(root);
                // 然后访问左子树
                root = root.left;
            } else {
                // 如果没有左子树,访问右子树
                root = stack.pop();
                root = root.right;
            }
        }
        return list;
    }

中序遍历:

java 复制代码
    /**
     * 中序遍历二叉树
     * @param root
     * @return
     */
    public List<Integer> inorderTraversal(TreeNode root) {
        Stack<TreeNode> stack = new Stack<>();
        List<Integer> list = new LinkedList<>();
        while (root != null || !stack.isEmpty()) {
            if (root!=null){
                stack.push(root);
                //先访问左子树
                root = root.left;
            }else {
                root = stack.pop();
                //访问根节点
                list.add(root.val);
                //访问右子树
                root = root.right;
            }
        }
        return list;
    }

后序遍历:

java 复制代码
    /**
     * 后序遍历二叉树
     * @param root
     * @return
     */
    public List<Integer> postorderTraversal(TreeNode root) {
        Stack<TreeNode> stack = new Stack<>();
        List<Integer> list = new LinkedList<>();
        // 记录上一个访问的节点
        TreeNode lastVisited = null;
        while (root != null || !stack.isEmpty()) {
            if (root != null) {
                stack.push(root);
                // 先访问左子树
                root = root.left;
            } else {
                TreeNode peekNode = stack.peek();
                // 如果右子树不存在或已经被访问过,则访问当前节点
                if (peekNode.right == null || peekNode.right == lastVisited) {
                    list.add(peekNode.val);
                    // 更新上一个访问的节点
                    lastVisited = stack.pop();
                } else {
                    // 否则访问右子树
                    root = peekNode.right;
                }
            }
        }
        return list;
    }

层序遍历:

java 复制代码
    /**
     * 层序遍历二叉树
     * @param root
     * @return
     */
    public List<Integer> levelorderTraversal(TreeNode root) {
        List<Integer> list = new LinkedList<>();
        // 如果根节点为空,直接返回空列表
        if (root == null) {
            return list;
        }
        LinkedList<TreeNode> queue = new LinkedList<>();
        queue.add(root);
        while (!queue.isEmpty()) {
            TreeNode node = queue.poll();
            list.add(node.val);
            if (node.left != null) {
                queue.add(node.left);
            }
            if (node.right != null) {
                queue.add(node.right);
            }
        }
        return list;
    }

测试代码:

先序遍历测试代码:

java 复制代码
    /**
     * 测试前序遍历
     */

    @Test
    public void testPreorderTraversal() {
        TreeNode root = new TreeNode(1);
        root.left = new TreeNode(2);
        root.right = new TreeNode(3);
        root.left.left = new TreeNode(4);
        root.left.right = new TreeNode(5);

        BinaryTree binaryTree = new BinaryTree();
        List<Integer> result = binaryTree.preorderTraversal(root);
        // 输出: [1, 2, 4, 5, 3]
        System.out.println(result);
    }

中序遍历测试代码:

java 复制代码
    /**
     * 测试中序遍历
     */
    @Test
    public void testInorderTraversal() {
        TreeNode root = new TreeNode(1);
        root.left = new TreeNode(2);
        root.right = new TreeNode(3);
        root.left.left = new TreeNode(4);
        root.left.right = new TreeNode(5);
        BinaryTree binaryTree = new BinaryTree();
        List<Integer> result = binaryTree.inorderTraversal(root);
        // 输出: [4, 2, 5, 1, 3]
        System.out.println(result);
    }

后序遍历测试代码:

java 复制代码
    /**
     * 测试后序遍历
     */
    @Test
    public void testPostorderTraversal() {
        TreeNode root = new TreeNode(1);
        root.left = new TreeNode(2);
        root.right = new TreeNode(3);
        root.left.left = new TreeNode(4);
        root.left.right = new TreeNode(5);
        BinaryTree binaryTree = new BinaryTree();
        List<Integer> result = binaryTree.postorderTraversal(root);
        // 输出: [4, 5, 2, 3, 1]
        System.out.println(result);
    }

层序遍历测试代码:

java 复制代码
    /**
     * 测试层序遍历
     */
    @Test
    public void testLevelorderTraversal() {
        TreeNode root = new TreeNode(1);
        root.left = new TreeNode(2);
        root.right = new TreeNode(3);
        root.left.left = new TreeNode(4);
        root.left.right = new TreeNode(5);
        BinaryTree binaryTree = new BinaryTree();
        List<Integer> result = binaryTree.levelorderTraversal(root);
        // 输出: [1, 2, 3, 4, 5]
        System.out.println(result);
    }

注:深度优先搜索策略与广度优先搜索策略暂不在本文探讨范围。

相关推荐
吞下星星的少年·-·29 分钟前
牛客周赛 119B题(贪心)
算法·贪心
NEFU_Jyj38 分钟前
牛客周赛R166(max型瓶颈最短路,前后缀DP合并)
算法·深度优先
Tisfy1 小时前
LeetCode 3644.排序排列:不对则与(脑筋急转弯)
数据结构·算法·leetcode·题解·位运算
lisw052 小时前
分岔论揭示演化突变密码
开发语言·算法·数学建模
aqiu1111112 小时前
C++ TopK:使用 nth_element 快速求最小 K 个数(蓝桥杯 / LeetCode 可用)
算法
H.莓飛2 小时前
【数据结构】快速排序专题
linux·服务器·c语言·数据结构·visual studio
Suprman2 小时前
平面排版问题的数学建模与算法设计
算法·数学建模·排序算法·排版套料
FPGA信号处理2 小时前
【应用随机过程】:更新过程与马尔可夫链入门
算法·概率论
重生之小比特3 小时前
【算法拾光】二分查找|在排序数组中查找元素的第一个和最后一个位置 + 搜索旋转排序数组
数据结构·算法·排序算法
吴可可1233 小时前
DXF与AAMA格式转换模块推荐
算法