leetcode 590 N 叉树的后序遍历

这篇博客介绍了如何使用迭代和递归两种方式实现N叉树的后序遍历。首先,展示了迭代法,通过使用双端队列存储节点,并从最后一个节点开始遍历子节点,将结果添加到结果列表的头部。然后,给出了递归法,从根节点开始,先遍历所有子树再添加当前节点的值。两个方法都在给定的示例上运行并输出了正确的后序遍历结果。

package Algorithms;

import java.util.*;

/**
 * 590. N 叉树的后序遍历
 * 给定一个 N 叉树,返回其节点值的 后序遍历 。
 * <p>
 * N 叉树 在输入中按层序遍历进行序列化表示,每组子节点由空值 null 分隔(请参见示例)。
 * <p>
 * <p>
 * <p>
 * 进阶:
 * <p>
 * 递归法很简单,你可以使用迭代法完成此题吗?
 * <p>
 * <p>
 * <p>
 * 示例 1:
 * <p>
 * <p>
 * <p>
 * 输入:root = [1,null,3,2,4,null,5,6]
 * 输出:[5,6,3,2,4,1]
 * 示例 2:
 * <p>
 * <p>
 * <p>
 * 输入:root = [1,null,2,3,4,5,null,null,6,7,null,8,null,9,10,null,null,11,null,12,null,13,null,null,14]
 * 输出:[2,6,14,11,7,3,12,8,4,13,9,10,5,1]
 * <p>
 * <p>
 * 提示:
 * <p>
 * N 叉树的高度小于或等于 1000
 * 节点总数在范围 [0, 10^4] 内
 * 通过次数51,765提交次数68,505
 */
public class postorder {

    //迭代器方式
    public static List<Integer> postorder(Node root) {
        LinkedList<Node> nodeLinkedList = new LinkedList<>();
        LinkedList<Integer> result = new LinkedList<>();
        if (root == null) {
            return result;
        }
        //添加所有节点到集合
        nodeLinkedList.add(root);
        //终止循环条件 集合元素全部取出
        while (!nodeLinkedList.isEmpty()) {
            //检索并删除此列表的最后一个元素,如果此列表为空,则返回null
            Node node = nodeLinkedList.pollLast();
            if (node != null) {
                //在结果列表头部加入元素
                result.addFirst(node.val);
                //遍历子列表
                for (Node child : node.children) {
                    //遍历元素如果不为空那么就添加节点到链表中 进行再次的循环添加
                    if (child != null) {
                        nodeLinkedList.add(child);
                    }
                }
            }
        }
        return result;
    }

    //递归方式
    public static List<Integer> postorder2(Node root) {
        List<Integer> result = new ArrayList<Integer>();
        if (root == null) {
            return result;
        }
        //非空节点先遍历子树再将值加上
        for (int i = 0; i < root.children.size(); i++) {
            result.addAll(postorder(root.children.get(i)));
        }
        result.add(root.val);
        return result;
    }

    public static void main(String[] args) {
        Node node1 = new Node(1);
        Node node2 = new Node(2);
        Node node3 = new Node(3);
        Node node4 = new Node(4);
        Node node5 = new Node(5);
        Node node6 = new Node(6);
        Node node7 = new Node(7);
        Node node8 = new Node(8);
        Node node9 = new Node(9);
        Node node10 = new Node(10);
        Node node11 = new Node(11);
        Node node12 = new Node(12);
        Node node13 = new Node(13);
        Node node14 = new Node(14);
        node1.children = new ArrayList<>();
        node1.children.add(node2);
        node1.children.add(node3);
        node1.children.add(node4);
        node1.children.add(node5);
        node3.children = new ArrayList<>();
        node3.children.add(node6);
        node3.children.add(node7);
        node7.children = new ArrayList<>();
        node7.children.add(node11);
        node11.children = new ArrayList<>();
        node11.children.add(node14);
        node4.children = new ArrayList<>();
        node4.children.add(node8);
        node8.children = new ArrayList<>();
        node8.children.add(node12);
        node5.children = new ArrayList<>();
        node5.children.add(node9);
        node5.children.add(node10);
        node9.children = new ArrayList<>();
        node9.children.add(node13);
        List<Integer> integerList = postorder(node1);
        System.out.println(integerList);
        List<Integer> integerList2 = postorder2(node1);
        System.out.println(integerList2);
    }

    static class Node {
        public int val;
        public List<Node> children;

        public Node() {
        }

        public Node(int val) {
            this.val = val;
        }

        public Node(int val, List<Node> children) {
            this.val = val;
            this.children = children;
        }
    }
}
 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值