树、二叉树的前中后层序遍历(递归、非递归Java实现)

这篇博客详细介绍了二叉树的前中后序遍历(递归和非递归)以及层序遍历的Java实现,包括LeetCode相关题目。内容涵盖递归解法、非递归解法,以及N叉树的前中后序遍历。
摘要由CSDN通过智能技术生成

1. 二叉树的前中后序遍历(递归,非递归)以及层序遍历

1.1 二叉树前中后遍历的递归解法

树的前中后序的遍历这个是很常见的问题,其递归做法相对简单,这里直接贴代码:

    // 前序遍历
    public static void preorder(TreeNode treeNode) {
   
        if (treeNode == null) return;
        System.out.print(treeNode.val + " ");
        preorder(treeNode.left);
        preorder(treeNode.right);
    }
    
    // 中序遍历
    public static void inorder(TreeNode treeNode) {
   
        if (treeNode == null) return;
        inorder(treeNode.left);
        System.out.print(treeNode.val + " ");
        inorder(treeNode.right);
    }

    // 后序遍历
    public static void postorder(TreeNode treeNode) {
   
        if (treeNode == null) return;
        postorder(treeNode.left);
        postorder(treeNode.right);
        System.out.print(treeNode.val + " ");
    }

从上面的代码中可以看到,树的前中后序遍历代码结构基本相同,差距只要在何时输出根值,前序遍历一遍历到节点时,先输出根植,中序是遍历完左子节点,后序是最后才输出,理解起来很容易。

1.2 二叉树前中后遍历的非递归解法

接下来我们来看看如何用非递归的方式,实现前中后序遍历:

1.2.1 非递归的前序遍历:(LeetCode 144)

在这里插入图片描述
前序遍历:34、35、29、25、33、42、40、39
根据树前序遍历的特点,我们很容易将其与栈的特点相结合,这里简单附上代码:

    // 前序遍历的非递归解法
    public List<Integer> preorderTraversal(TreeNode root) {
   
        List<Integer> lists = new ArrayList<>();
        if (root == null) return lists;
        Stack<TreeNode> stack = new Stack<>();
        stack.push(root);
        TreeNode temp = null;
        while (!stack.isEmpty()) {
   
            temp = stack.pop();
            lists.add(temp.val);
            // 这里注意,要先压入右子节点,再压入左节点
            if (temp.right != null) {
   
                stack.push(temp.right);
            }
            if (temp.left != null) {
   
                stack.push(temp.left);
            }
        }
        return lists;
    }

1.2.2 非递归的中序遍历:(LeetCode 94)

  • 10
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值