算法:Java构建二叉树并迭代实现二叉树的前序、中序、后序遍历

先自定义一下二叉树的类:

java 复制代码
// Definition for a binary tree node.
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 复制代码
import java.util.ArrayList;
import java.util.Deque;
import java.util.LinkedList;
import java.util.List;


class preorderTraversalSolution {

    public static void main(String[] args) {
        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);
        root.right.right = new TreeNode(6);
        Solution sol = new Solution();
        // 前序、中序、后序
        System.out.println(sol.preorderTraversal(root).toString());  //[1, 2, 4, 5, 3, 6]
        System.out.println(sol.inorderTraversal(root).toString());  //[4, 2, 5, 1, 3, 6]
        System.out.println(sol.postorderTraversal(root).toString());  //[4, 5, 2, 6, 3, 1]
    }
}


class Solution {
    //前序遍历
    public List<Integer> preorderTraversal(TreeNode root) {
        List<Integer> res = new ArrayList<Integer>();
        if (root == null) {
            return res;
        }
        Deque<TreeNode> stack = new LinkedList<TreeNode>();
        TreeNode node = root;
        while(!stack.isEmpty() || node != null){
            while (node != null) {
                res.add(node.val);  //相比中序遍历,只有这行代码换了位置
                stack.push(node);
                node = node.left;
            }
            node = stack.pop();
            node = node.right;
        }
        return res;
    }
    //中序遍历
    public List<Integer> inorderTraversal(TreeNode root) {
        List<Integer> res = new ArrayList<Integer>();
        if (root == null) {
            return res;
        }
        Deque<TreeNode> stack = new LinkedList<TreeNode>();
        TreeNode node = root;
        while(!stack.isEmpty() || node != null){
            while (node != null) {
                stack.push(node);
                node = node.left;
            }
            node = stack.pop();
            res.add(node.val);  //相比前序遍历,只有这行代码换了位置
            node = node.right;
        }
        return res;
    }
    //后序遍历
    public List<Integer> postorderTraversal(TreeNode root) {
        List<Integer> res = new ArrayList<Integer>();
        if (root == null) {
            return res;
        }
        Deque<TreeNode> stack = new LinkedList<TreeNode>();
        TreeNode node = root;
        TreeNode pre = null;
        while(!stack.isEmpty() || node != null){
            while (node != null) {
                stack.push(node);
                node = node.left;
            }
            node = stack.pop();
            if (node.right == null || node.right == pre) {
                //如果不存在右子树,则输出该节点的值
                //如果该节点的右结点刚刚遍历过了,则也应该输出该节点的值
                res.add(node.val);
                pre = node;
                node = null;
            }else{
                //如果存在右子树,则重新放回栈中,因为它的值要在右子树遍历完之后添加
                stack.push(node);
                node = node.right;
            }
        }
        return res;
    }
}

三种遍历方式的Java递归实现在这里:算法:Java构建二叉树并递归实现二叉树的前序、中序、后序遍历-CSDN博客

相关推荐
小指纹32 分钟前
图论-最短路 Bellman-Ford算法
c++·算法·objective-c·图论
屁股割了还要学33 分钟前
【数据结构入门】时间、空间复杂度的计算
c语言·开发语言·数据结构·c++·算法
myjs99943 分钟前
数学=符号
java·前端·算法
麦兜*1 小时前
大模型时代,Transformer 架构中的核心注意力机制算法详解与优化实践
jvm·后端·深度学习·算法·spring·spring cloud·transformer
coding随想1 小时前
算法界的“达摩克利斯之剑”——NP完全性理论
算法
秋难降2 小时前
栈:从基础概念到实战解题(详细)
数据结构·算法·排序算法
归云鹤2 小时前
QT信号和槽怎么传输自己定义的数据结构
开发语言·数据结构·qt
ezl1fe2 小时前
RAG 每日一技(十):向量检索的“死穴”?用混合搜索(Hybrid Search)来拯救!
后端·算法
Ahu_iii2 小时前
【图论基础】理解图的“闭环”:Tarjan 强连通分量算法全解析
算法·图论
PixelMind3 小时前
【IQA技术专题】DISTS代码讲解
图像处理·人工智能·python·算法·iqa