N 叉树的前序遍历

给定一个 N 叉树,返回其节点值的前序遍历 。

N 叉树 在输入中按层序遍历进行序列化表示,每组子节点由空值 null 分隔(请参见示例)。

示例1

 

输入:root = [1,null,3,2,4,null,5,6]
输出:[1,3,5,6,2,4]
示例2:

 

输入: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]
输出:[1,2,3,6,7,11,14,4,8,12,5,9,13,10]

对于二叉树遍历问题我们用最简单,最暴力的方法就是递归,如果只是AC的话,递归完全可以,如果面试的话,面试官可能会让你写出非递归遍历,接下来会分别介绍这两种方法,

递归思路:对于二叉树来说,前序遍历就是先输出根节点,再输出左节点,再输出右节点,根据这个思路我们可以写出对于N叉树的前序遍历方法

1、先输出根节点

2、遍历根节点的孩子节点,

3、重复步骤1

    public List<Integer> preorder(Node root) {
        List<Integer> result = new ArrayList<>();
        if(root == null) return result;
        digui(root,result);
        return result;
    }

    public void digui(Node root,List<Integer> result){
        if(root == null) return;
        result.add(root.val);
        List<Node> list = root.children;
        for(int i = 0;i<list.size();i++){
            digui(list.get(i),result);
        }
    }        

非递归:同样的先想哈二叉树非递归的思路,它需要结合栈来实现,我们都知道栈是先进后出的结构,而前序遍历的顺序是根节点,左孩子,右孩子,那么入栈顺序就是将根节点的左右孩子按右孩子、左孩子的顺序入栈,最后再出栈就是前序遍历的结果。根据这个思路我们可以写出对于N叉树前序遍历的非递归方法

首先将根节点入栈

1,判断栈是否为空,不为空就出栈

2、再将他的孩子节点从右节点到左节点入栈

3、重复1

    public List<Integer> preorder(Node root) {
        List<Integer> result = new ArrayList<Integer>();
        Stack<Node> stack = new Stack<Node>();
        if(root == null)
            return result;
        stack.push(root);
        while(!stack.isEmpty())
        {
            Node node = stack.pop();
            result.add (node.val);
       //逆序 Collections.reverse(node.children);
for(Node tmp : node.children) { stack.add(tmp); } } return result; }
原文地址:https://www.cnblogs.com/du001011/p/14515068.html