二叉树遍历

二叉树遍历非递归实现

目录

二叉树遍历非递归实现

树节点定义:

先序遍历:

中序遍历:

后序遍历:

测试代码:

先序遍历测试代码:

中序遍历测试代码:

后序遍历测试代码:


树节点定义:

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

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

相关推荐
chao_7893 分钟前
二分查找篇——搜索旋转排序数组【LeetCode】两次二分查找
开发语言·数据结构·python·算法·leetcode
秋说2 小时前
【PTA数据结构 | C语言版】一元多项式求导
c语言·数据结构·算法
Maybyy2 小时前
力扣61.旋转链表
算法·leetcode·链表
谭林杰3 小时前
B树和B+树
数据结构·b树
卡卡卡卡罗特4 小时前
每日mysql
数据结构·算法
chao_7895 小时前
二分查找篇——搜索旋转排序数组【LeetCode】一次二分查找
数据结构·python·算法·leetcode·二分查找
lifallen6 小时前
Paimon 原子提交实现
java·大数据·数据结构·数据库·后端·算法
lixzest6 小时前
C++ Lambda 表达式详解
服务器·开发语言·c++·算法
EndingCoder6 小时前
搜索算法在前端的实践
前端·算法·性能优化·状态模式·搜索算法
丶小鱼丶6 小时前
链表算法之【合并两个有序链表】
java·算法·链表