二叉树遍历

二叉树遍历非递归实现

目录

二叉树遍历非递归实现

树节点定义:

先序遍历:

中序遍历:

后序遍历:

测试代码:

先序遍历测试代码:

中序遍历测试代码:

后序遍历测试代码:


树节点定义:

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);
    }

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

相关推荐
心中有国也有家18 分钟前
hccl 架构拆解:昇腾集合通信库到底在做什么?
人工智能·经验分享·笔记·分布式·算法·架构
小O的算法实验室1 小时前
2026年MCS,Q-learning增强MOPSO与改进DWA融合算法+复杂三维地形下特定移动机器人动态路径规划
算法
Peter·Pan爱编程2 小时前
10. new_delete 不是 malloc_free 的包装
c++·人工智能·算法
不知名的老吴3 小时前
双栈秒杀表达式的生成方式
数据结构
故事和你913 小时前
洛谷-【动态规划1】动态规划的引入2
开发语言·数据结构·c++·算法·动态规划·图论
重生之我是Java开发战士3 小时前
【动态规划】背包问题:完全背包,二位费用的背包问题,似包非包
算法·动态规划
LabVIEW开发3 小时前
LabVIEW实现FDTD 电磁仿真
算法·labview·labview知识·labview功能·labview程序
Together_CZ4 小时前
DTSemNet :Vanilla Gradient Descent for Oblique Decision Trees——用于倾斜决策树的普通梯度下降
算法·决策树·机器学习·vanilla·gradient·dtsemnet·用于倾斜决策树的普通梯度
一条大祥脚4 小时前
ABC459 贪心构造|树形DP|组合数学|贪心|单调栈|势能|前缀和
算法·深度优先
灰灰勇闯IT4 小时前
DeepEP:MoE 推理的 AllToAll 通信瓶颈怎么解
算法·cann