🤖
AI审核中

READING IN THE WILD · 读一篇手记

牛客 NC45 二叉树的先序中序和后序遍历

文章摘要

本文介绍了牛客网 NC45 题目——实现二叉树的先序、中序和后序遍历。要求在 O(n) 时间、O(n) 空间内完成,对空树返回空数组。解法使用三个 `ArrayList<Integer>` 分别存储三种遍历结果,递归实现 `firstOrder`、`middleOrder`、`laterOrder`,遍历结束后通过 `toIntArray` 将列表转为 `int[]` 并组装成 `int[3][]` 返回。代码简洁明了,重点在于确定存储结构、递归遍历逻辑以及列表转数组的实现。

题目链接:https://www.nowcoder.com/practice/a9fec6c46a684ad5a3abd4e365a9d362

题目描述

给定一棵二叉树,分别按照二叉树先序,中序和后序打印所有的节点。

数据范围:0≤n≤1000,树上每个节点的val值满足 0≤val≤100

要求:空间复杂度 O(n),时间复杂度 O(n)

样例解释:

示例 1:

输入:{1,2,3}
返回值:[[1,2,3],[2,1,3],[2,3,1]]
说明:如题面图

示例 2:

输入:{}
返回值:[[],[],[]]

解题代码

import java.util.*;
import java.util.ArrayList;
/*
 * public class TreeNode {
 *   int val = 0;
 *   TreeNode left = null;
 *   TreeNode right = null;
 * }
 */

public class Solution {
    //先序遍历存储数组
    public ArrayList<Integer> first = new ArrayList<>();
    //中序遍历存储数组
    public ArrayList<Integer> middle = new ArrayList<>();
    //后续遍历存储数组
    public ArrayList<Integer> later = new ArrayList<>();   
    /**
     *
     * @param root TreeNode类 the root of binary tree
     * @return int整型二维数组
     */
    public int[][] threeOrders(TreeNode root) {
        // write code here
        //关键点
        //1.确定存储数组大小 OR 使用 ArrayList
        //2.前中后遍历算法
        //3.ArrayList 数组转 int[] 数组方法
        firstOrder(root);
        middleOrder(root);
        laterOrder(root);
        int[][] result = new int[3][first.size()];
        result[0] = toIntArray(first);
        result[1] = toIntArray(middle);
        result[2] = toIntArray(later);
        return result;
    }   
    //ArrayList 转 int[]
    public int[] toIntArray(ArrayList<Integer> list) {
        if (list == null || list.size() < 1) {
            return new int[0];
        }
        return list.stream().mapToInt(Integer::valueOf).toArray();
    }   
    //先序遍历
    public void firstOrder(TreeNode root) {
        //跳出条件
        if (root == null) {
            return;
        }
        first.add(root.val);
        firstOrder(root.left);
        firstOrder(root.right);
    }   
    //中序遍历
    public void middleOrder(TreeNode root) {
        //跳出条件
        if (root == null) {
            return;
        }
        middleOrder(root.left);
        middle.add(root.val);
        middleOrder(root.right);
    }   
    //后序遍历
    public void laterOrder(TreeNode root) {
        //跳出条件
        if (root == null) {
            return;
        }
        laterOrder(root.left);
        laterOrder(root.right);
        later.add(root.val);
    }
}
0 条评论

如果你觉得文章对你有帮助,那就请作者喝杯咖啡吧

评论区 0

头像
 0 条评论