【LeetCode每日一题】589:N 叉树的前序遍历

100 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第23天,点击查看活动详情

LeetCode每日一题打卡专栏正式启动!不出意外将日更LeetCode的每日一题,敬请期待。

589:N 叉树的前序遍历

题意

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

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

示例1:

img

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

示例2:

img

输入: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]

提示:

  • 节点总数在范围 内
  • n 叉树的高度小于或等于 1000

题解一:递归

直接参照二叉树前序遍历即可,很简单。

C++代码:

/*
// Definition for a Node.
class Node {
public:
    int val;
    vector<Node*> children;
​
    Node() {}
​
    Node(int _val) {
        val = _val;
    }
​
    Node(int _val, vector<Node*> _children) {
        val = _val;
        children = _children;
    }
};
*/class Solution {
public:
    vector<int> ans;
    void dfs(Node* root){
        if(root==NULL) return ;
        ans.push_back(root->val);
        for(int i=0;i<root->children.size();i++){
            dfs(root->children[i]);
        }
    }
    vector<int> preorder(Node* root) {
        ans.clear();
        dfs(root);
        return ans;
    }
};

题解二:迭代

通过栈模拟递归操作。前序遍历,我们先遍历当前节点,再从左到右遍历其每个子树。由于栈是后进先出的原理,于是我们从右到左入栈,然后出栈顺序便满足了从左到右遍历每个子树。

C++代码:

/*
// Definition for a Node.
class Node {
public:
    int val;
    vector<Node*> children;
​
    Node() {}
​
    Node(int _val) {
        val = _val;
    }
​
    Node(int _val, vector<Node*> _children) {
        val = _val;
        children = _children;
    }
};
*/class Solution {
public:
    vector<int> preorder(Node* root) {
        vector<int> ans;
        if(root==NULL) return ans;
        stack<Node*> sta;
        sta.push(root);
        while(!sta.empty()){
            Node* now=sta.top();sta.pop();
            ans.push_back(now->val);
            for(int i=now->children.size()-1;i>=0;i--) sta.push(now->children[i]);
        }
        return ans;
    }
};

Java代码:

/*
// Definition for a Node.
class Node {
    public int val;
    public List<Node> children;
​
    public Node() {}
​
    public Node(int _val) {
        val = _val;
    }
​
    public Node(int _val, List<Node> _children) {
        val = _val;
        children = _children;
    }
};
*/class Solution {
    public List<Integer> preorder(Node root) {
        List<Integer> ans=new ArrayList<>();
        if(root==null) return ans;
        Deque<Node> stack=new ArrayDeque<>();
        stack.push(root);   //尾部插入
        while(!stack.isEmpty()){
            Node now=stack.poll();   //检索并删除
            ans.add(now.val); 
            for(int i=now.children.size()-1;i>=0;i--){
                stack.push(now.children.get(i));
            }
        }
        return ans;
    }
}