java二叉树前中后序遍历

这篇具有很好参考价值的文章主要介绍了java二叉树前中后序遍历。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

  • 代码随想录解题思路
  • 🆒力扣前序题目
  • 🆒力扣中序题目
  • 🆒力扣后序题目

递归遍历

// 前序遍历
class Solution {
    public List<Integer> preorderTraversal(TreeNode root) {
        List<Integer> res = new ArrayList<>();
        preorder(root,res);
        return res;
    }
    public void preorder(TreeNode root, List<Integer> res){
        if(root==null) return ;
        res.add(root.val);
        preorder(root.left,res);
        preorder(root.right,res);
    }
}

// 中序遍历
class Solution {
    public List<Integer> inorderTraversal(TreeNode root) {
        List<Integer> res=new ArrayList<>();
        inorder(root,res);
        return res;
    }
    public void inorder(TreeNode root,List<Integer> res){
        if(root==null) return ;
        inorder(root.left,res);
        res.add(root.val);
        inorder(root.right,res);
    }
}

// 后序遍历
class Solution {
    public List<Integer> postorderTraversal(TreeNode root) {
        List<Integer> res = new ArrayList<>();
        postorder(root, res);
        return res;
    }

    public void postorder(TreeNode root, List<Integer> res) {
        if (root == null)
            return;
        postorder(root.left,res);
        postorder(root.right,res);
        res.add(root.val);
    }
}

🆘二叉树的统一迭代遍历

💡一个大模板,前中后序只需要改变几句代码的顺序即可

代码随想录思路文章来源地址https://www.toymoban.com/news/detail-848411.html

package com.tree;

import jdk.nashorn.internal.ir.SplitReturn;

import java.util.*;

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

class demo12_BinaryTreeTraversal {
    /**
     * 二叉树的非递归前序遍历
     *
     * @param root
     * @return 前序遍历的节点列表
     */
    public static List<Integer> preorderTraversal(TreeNode root) {
        List<Integer> res = new ArrayList<>();
        Stack<TreeNode> st = new Stack<>();
        if (root == null) {
            return res;
        } else st.push(root);
        while (!st.isEmpty()) {
            TreeNode node = st.peek();
            if (node != null) {
                st.pop();
                if (node.right != null) st.push(node.right);
                if (node.left != null) st.push(node.left);
                st.push(node);
                st.push(null);
            } else {
                st.pop();
                node = st.pop();
                res.add(node.val);
            }
        }
        return res;
    }

    /**
     * 二叉树的非递归中序遍历
     *
     * @param root
     * @return 中序遍历的节点列表
     */
    public static List<Integer> inorderTraversal(TreeNode root) {
        List<Integer> res = new ArrayList<>();
        Stack<TreeNode> st = new Stack<>();
        if (root == null) {
            return res;
        } else st.push(root);
        while (!st.empty()) {
            TreeNode cur = st.peek();
            if (cur != null) {
                st.pop();
                //中序遍历:左根右,so入栈顺序是右根左,在根入栈之后记得入栈一个null节点标记
                if (cur.right != null) st.push(cur.right);
                st.push(cur);
                st.push(null);
                if (cur.left != null) st.push(cur.left);
            } else {
                st.pop();
                cur = st.pop();
                res.add(cur.val);
            }
        }
        return res;
    }

    /**
     * 二叉树的非递归后序遍历
     *
     * @param root
     * @return 后序遍历的节点列表
     */
    public static List<Integer> postorderTraversal(TreeNode root) {
        List<Integer> res = new ArrayList<>();
        if (root == null) {
            return res;
        }
        Stack<TreeNode> st = new Stack<>();
        st.push(root);
        while (!st.empty()) {
            TreeNode point = st.peek();
            if (point != null) {
                //出栈左右根,入栈根右左
                st.pop();
                st.push(point);
                st.push(null);
                if (point.right != null) st.push(point.right);
                if (point.left != null) st.push(point.left);
            } else {
                st.pop();
                point = st.pop();
                res.add(point.val);
            }
        }
        return res;
    }

    public static void main(String[] args) {
        // 创建二叉树 [1,null,2,3]
        TreeNode root = new TreeNode(1);
        root.right = new TreeNode(2);
        root.right.left = new TreeNode(3);
        System.out.println(preorderTraversal(root));
        System.out.println(postorderTraversal(root));
        System.out.println(inorderTraversal(root));
    }
}

迭代遍历

import jdk.nashorn.internal.ir.SplitReturn;

import java.util.*;

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

class demo12_BinaryTreeTraversal {
    /**
     * 二叉树的非递归中序遍历
     *
     * @param root
     * @return 中序遍历的节点列表
     */
    public static List<Integer> inorderTraversal(TreeNode root) {
        List<Integer> res = new ArrayList<>();
        Stack<TreeNode> st = new Stack<>();
        TreeNode cur = root; // 设定一个指针
        while (cur != null || !st.isEmpty()) {
            if (cur != null) {
                st.push(cur);
                cur = cur.left;
            } else {
                cur = st.pop(); // 出栈
                res.add(cur.val);
                cur = cur.right;
            }
        }
        return res;
    }

    /**
     * 二叉树的非递归前序遍历
     *
     * @param root
     * @return 前序遍历的节点列表
     */
    public static List<Integer> preorderTraversal(TreeNode root) {
        // 定义res
        List<Integer> res = new ArrayList<>();
        if (root == null) {
            return res;
        }
        // 定义栈
        Stack<TreeNode> st = new Stack<>();
        st.push(root);
        while (!st.isEmpty()) {
            TreeNode tmp = st.pop(); // 出栈
            res.add(tmp.val);
            if (tmp.right != null) {
                st.push(tmp.right); // 先在栈中加入右节点,再加入左节点
            }
            if (tmp.left != null) {
                st.push(tmp.left); // 因为左节点要先出栈,栈是FILO的结构
            }
        }
        return res;
    }

    /**
     * 二叉树的非递归后序遍历
     *
     * @param root
     * @return 后序遍历的节点列表
     */
    public static List<Integer> postorderTraversal(TreeNode root) {
        List<Integer> res = new ArrayList<>();
        if (root == null) {
            return res;
        }
        Stack<TreeNode> st = new Stack<>();
        st.push(root);
        while (!st.isEmpty()) {
            TreeNode node = st.pop();
            res.add(node.val);
            // 注意:入栈顺序相对于前序遍历有改变
            // 前序遍历的入栈顺序是:中右左
            // 后序遍历的顺序变成了:中左右,然后反转result_list
            if (node.left != null) {
                st.push(node.left);
            }
            if (node.right != null) {
                st.add(node.right);
            }
        }
        Collections.reverse(res);
        return res;
    }

    public static void main(String[] args) {
        // 创建二叉树 [1,null,2,3]
        TreeNode root = new TreeNode(1);
        root.right = new TreeNode(2);
        root.right.left = new TreeNode(3);
        System.out.println(preorderTraversal(root));
        System.out.println(postorderTraversal(root));
        System.out.println(inorderTraversal(root));
    }
}

到了这里,关于java二叉树前中后序遍历的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 【Java数据结构】二叉树的前中后序遍历(递归和非递归)

    【Java数据结构】二叉树的前中后序遍历(递归和非递归)

    二叉树遍历是二叉树的一种重要操作 必须要掌握 二叉树的遍历可以用递归和非递归两种做法来实现 前序遍历的遍历方式是 先根节点 在左节点 在右节点 述这棵树前序遍历的结果是: A B D E C F G 递归的思想就是把问题拆分成一个个小问题来解决 treeNode是一个内部类 具体实现

    2023年04月26日
    浏览(9)
  • 数据结构——二叉树线索化遍历(前中后序遍历)

    数据结构——二叉树线索化遍历(前中后序遍历)

    为什么要转换为线索化         二叉树线索化是一种将普通二叉树转换为具有特殊线索(指向前驱和后继节点)的二叉树的过程。这种线索化的目的是为了提高对二叉树的遍历效率,特别是在不使用递归或栈的情况下进行遍历。         将二叉树线索化的主要目的是为了

    2024年02月09日
    浏览(8)
  • 【二叉树初阶】前中后序遍历+层序遍历+基础习题

    【二叉树初阶】前中后序遍历+层序遍历+基础习题

    本篇文章将用大白话以及图解讲解二叉树初阶的遍历和相关习题,初学二叉树的小白一看就会。 普通二叉树的增删查改是没有价值的,用它存数据太麻烦,不如用顺序表、链表、至多是完全二叉树存储,所以我们只关注遍历过程,因为学习二叉树最简单的方式就是遍历,也为

    2024年02月02日
    浏览(33)
  • 数据结构 | 二叉树的概念及前中后序遍历

    数据结构 | 二叉树的概念及前中后序遍历

    下面内容来自百度百科 二叉树(Binary tree)是树形结构的一个重要类型。许多实际问题抽象出来的数据结构往往是二叉树形式,即使是一般的树也能简单地转换为二叉树,而且二叉树的存储结构及其算法都较为简单,因此二叉树显得特别重要。二叉树特点是每个节点最多只能

    2024年02月05日
    浏览(10)
  • 【数据结构】二叉树的前中后序遍历(C语言)

    【数据结构】二叉树的前中后序遍历(C语言)

    [二叉树] 顾名思义就是有 两个分支节点的树,不仅如此,除了叶子外的所有节点都具有两个分支节点; 由于结构像一棵倒立的树,顾名思义为二叉树 ; 如下图所示,该图即为一棵 野生的二叉树 ; 既然二叉树为树,固然有着和树一样的部分( 叶子、根、分支… ) 这些也成为

    2024年02月17日
    浏览(14)
  • C++ 二叉树(建立、销毁、前中后序遍历和层次遍历,寻找双亲结点等)

    C++ 二叉树(建立、销毁、前中后序遍历和层次遍历,寻找双亲结点等)

    (1) 结构体和类定义 (2)创建二叉树 (3)前中后序遍历和层序遍历 (4)复制二叉树 (5)销毁二叉树 (6)析构函数 (7)求树的高度 (8)获取结点,判断其是否在二叉树中 (9)计算结点个数和获取结点个数 (10)二叉树判空 (11)获取根结点 源代码: btree.h btree.cp

    2024年02月13日
    浏览(22)
  • 【数据结构】二叉树的·深度优先遍历(前中后序遍历)and·广度优先(层序遍历)

    【数据结构】二叉树的·深度优先遍历(前中后序遍历)and·广度优先(层序遍历)

    💐 🌸 🌷 🍀 🌹 🌻 🌺 🍁 🍃 🍂 🌿 🍄🍝 🍛 🍤 📃 个人主页 :阿然成长日记 👈点击可跳转 📆 个人专栏: 🔹数据结构与算法🔹C语言进阶 🚩 不能则学,不知则问,耻于问人,决无长进 🍭 🍯 🍎 🍏 🍊 🍋 🍒 🍇 🍉 🍓 🍑 🍈 🍌 🍐 🍍 (1) 先序遍历 的过

    2024年01月24日
    浏览(15)
  • 【二叉树】1-5,理论基础、前中后序遍历的递归法和迭代法、层序遍历

    【二叉树】1-5,理论基础、前中后序遍历的递归法和迭代法、层序遍历

    除最后一层无任何子节点外,每一层上的所有结点都有两个子结点的二叉树。 一个深度为k的有n个节点的二叉树,对树中的节点按从上至下、从左到右的顺序进行编号,如果编号为i(1≤i≤n)的结点与满二叉树中编号为i的结点在二叉树中的位置相同,则这棵二叉树称为完全

    2024年02月13日
    浏览(11)
  • 【数据结构】前中后层序遍历 --二叉树的结构特点与遍历方式

    【数据结构】前中后层序遍历 --二叉树的结构特点与遍历方式

      Halo,这里是Ppeua。平时主要更新C语言,C++,数据结构算法......感兴趣就关注我吧!你定不会失望。 🌈个人主页:主页链接 🌈算法专栏:专栏链接       我会一直往里填充内容哒! 🌈LeetCode专栏:专栏链接       目前在刷初级算法的LeetBook 。若每日一题当中有力所能

    2023年04月09日
    浏览(8)
  • 数据结构——二叉树的先中后序遍历

    数据结构——二叉树的先中后序遍历

    ——本节内容为Bilibili王道考研《数据结构》P43~P45视频内容笔记。 目录 一、二叉树的先中后序遍历 1.先中后序遍历 2.举例  3.先中后序遍历和前中后缀的关系 4.代码实现 5.求遍历序列 6.应用:求树的深度 二、二叉树的层次遍历 1.层次遍历 2.算法思想: 3.算法演示: 4.代码实

    2024年02月12日
    浏览(8)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包