二叉树遍历

二叉树遍历非递归实现

目录

二叉树遍历非递归实现

树节点定义:

先序遍历:

中序遍历:

后序遍历:

测试代码:

先序遍历测试代码:

中序遍历测试代码:

后序遍历测试代码:


树节点定义:

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

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

相关推荐
CQU_JIAKE6 分钟前
9.29【A】
算法·深度优先
没落之王34 分钟前
AI在文言文——论文脉复苏对AI的意义
大数据·人工智能·算法
u0111026751 小时前
工具页案例图如何编写 alt让图片说明与处理场景对应
java·前端·javascript·图像处理·人工智能·算法·ai作画
阿狗童鞋1 小时前
数据结构与算法实战指南
数据结构·算法
Navigator_Z1 小时前
LeetCode //C - 1275. Find Winner on a Tic Tac Toe Game
c语言·算法·leetcode
未来之窗软件服务1 小时前
递归时间复杂度演算T (n)=aT (n/b)+f (n)-东方仙盟
算法·仙盟创梦ide·东方仙盟
垆边人似月.2 小时前
华为机考题:明明的随机数
数据结构·算法·华为
Doubbbbbbble云2 小时前
多维空间索引结构R树与KD树性能对比研究4
算法
海上小飞龙2 小时前
【KMP算法-中篇】next 数组的递推:往前填一位,靠的是往回退几步
算法
lusklusklusk2 小时前
Python 四大数据结构详解:元组、列表、集合、字典的特点与增删改查
数据结构·windows·python