算法: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博客

相关推荐
To_OC几秒前
从一次栈溢出报错说起,我把递归彻底扒明白了
javascript·算法·程序员
千纸鹤安安5 小时前
千问Qwen-AgentWorld来了:一个语言模型搞定七大Agent场景,GPT-5.4都输了
算法
七牛开发者7 小时前
MCP 到底是什么?为什么 Agent 都想接上它
算法·aigc·agent
北域码匠11 小时前
冒泡排序太慢?鸡尾酒排序双向优化,原生 C# 零第三方库完整代码
数据结构·排序算法·泛型·c# 算法·鸡尾酒排序·原生 c# 开发·冒泡排序优化·嵌入式算法
kisshyshy14 小时前
从递归到迭代,一文吃透二叉树的核心知识与 JavaScript 实现
javascript·算法·代码规范
To_OC1 天前
LC 49 字母异位词分组:想到哈希表很简单,选对 key 才是精髓
javascript·算法·leetcode
用户938515635071 天前
从 O(n²) 到 O(nlogn):一文读懂快速排序的“快”与“妙”
javascript·算法
To_OC1 天前
手写快排次次翻车?别死背快排模板了,这才是面试官想听的底层逻辑
javascript·算法·排序算法