二叉树遍历

二叉树遍历非递归实现

目录

二叉树遍历非递归实现

树节点定义:

先序遍历:

中序遍历:

后序遍历:

测试代码:

先序遍历测试代码:

中序遍历测试代码:

后序遍历测试代码:


树节点定义:

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

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

相关推荐
多多*4 分钟前
写两个hascode和equals的例子
java·开发语言·jvm·spring boot·算法·spring·缓存
weisian15140 分钟前
力扣经典算法篇-13-接雨水(较难,动态规划,加法转减法优化,双指针法)
算法·leetcode·动态规划
敲代码的瓦龙1 小时前
C++?继承!!!
c语言·开发语言·c++·windows·后端·算法
简简单单做算法1 小时前
基于FPGA的二叉决策树cart算法verilog实现,训练环节采用MATLAB仿真
算法·决策树·fpga开发·cart算法·二叉决策树
白熊1881 小时前
【机器学习基础】机器学习入门核心算法:K-近邻算法(K-Nearest Neighbors, KNN)
算法·机器学习·近邻算法
北京地铁1号线2 小时前
MMdetection推理验证输出详解(单张图片demo)
前端·算法
oioihoii2 小时前
C++23 新成员函数与字符串类型的改动
算法·c++23
似水এ᭄往昔2 小时前
【数据结构】——二叉树堆(下)
数据结构·算法
GG不是gg2 小时前
Prim算法剖析与py/cpp/java语言实现
算法
秋山落叶万岭花开ღ3 小时前
探索数据结构之顺序表:从入门到精通
数据结构·python·算法