列表

详情


BM23. 二叉树的前序遍历

描述

给你二叉树的根节点 root ,返回它节点值的 前序 遍历。

数据范围:二叉树的节点数量满足 ,二叉树节点的值满足 ,树的各节点的值各不相同

示例 1:


示例1

输入:

{1,#,2,3}

输出:

[1,2,3]

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++ 解法, 执行用时: 2ms, 内存消耗: 428KB, 提交时间: 2022-01-25

/**
 * struct TreeNode {
 *	int val;
 *	struct TreeNode *left;
 *	struct TreeNode *right;
 *	TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 * };
 */
class Solution {
public:
    vector<int> res;
    void dfs(TreeNode* Node){
        if(Node == nullptr) return;
        res.push_back(Node->val);
        dfs(Node->left);
        dfs(Node->right);
    }
    vector<int> preorderTraversal(TreeNode* root) {
        // write code here
        dfs(root);
        return res;
    }
};

C++ 解法, 执行用时: 2ms, 内存消耗: 432KB, 提交时间: 2022-02-09

/**
 * struct TreeNode {
 *	int val;
 *	struct TreeNode *left;
 *	struct TreeNode *right;
 *	TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 * };
 */
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param root TreeNode类 
     * @return int整型vector
     */
    vector<int> preorderTraversal(TreeNode* root) {
        // write code here
        stack<TreeNode*> sta;
        vector<int> vec;
        if(root == nullptr) return {};
        sta.push(root);
        while(!sta.empty()){
            TreeNode* node = sta.top();
            sta.pop();
            vec.push_back(node->val);
            if(node->right) sta.push(node->right);
            if(node->left) sta.push(node->left);
        }
        return vec;
    }
};

C++ 解法, 执行用时: 2ms, 内存消耗: 468KB, 提交时间: 2022-02-08

/**
 * struct TreeNode {
 *	int val;
 *	struct TreeNode *left;
 *	struct TreeNode *right;
 *	TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 * };
 */
class Solution {
public:
    /*
    方法一:递归
    
    复杂度分析:
    时间复杂度为O(N),空间复杂度为O(N)。
    该方法在递归过程中需要使用栈空间,在最坏情况下(二叉树退化为链表),空间复杂度为O(N)。
    */
    vector<int> preorderTraversal1(TreeNode* root) {
        preorder(root);
        return pre;
    }
    
    /*
    方法二:非递归(利用栈) - 要能熟练写出这种解法!
    
    复杂度分析:
    采用非递归算法,但是同样需要遍历每一个元素,故时间复杂度为O(N),
    在非递归算法中设置了栈和容器对象用于存放root的值和最后的结果,所以空间复杂度为O(N)。
    */
    vector<int> preorderTraversal(TreeNode* root) {
        if(root==NULL){
            return pre;
        }
        stack<TreeNode*> tmp;//设置栈对象
        tmp.push(root);//保存根结点
        while(!tmp.empty()){
            auto x = tmp.top();
            tmp.pop();//出栈
            pre.push_back(x->val);//存入容器
            if(x->right){
                tmp.push(x->right);
            }
            if(x->left){
                tmp.push(x->left);
            }
        }
        return pre;
    }
    
private:
    vector<int> pre;
    
    void preorder(TreeNode* root){//中左右
        if(root == NULL)
            return ;
        pre.push_back(root->val);//在Vector最后添加一个元素(参数为要插入的值)
        preorder(root->left);
        preorder(root->right);
    }
};

C++ 解法, 执行用时: 2ms, 内存消耗: 488KB, 提交时间: 2022-03-13

/**
 * struct TreeNode {
 *	int val;
 *	struct TreeNode *left;
 *	struct TreeNode *right;
 *	TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 * };
 */
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param root TreeNode类 
     * @return int整型vector
     */
    vector<int> preorderTraversal(TreeNode* root) {
        // write code here
        vector<int> res;
        if(root)
            pre_view(root,res);
        return res;
    }
    
    void pre_view(TreeNode *root,vector<int>&res)
    {
        res.emplace_back(root->val);
        if(root->left)
            pre_view(root->left, res);
        if(root->right)
            pre_view(root->right, res);
    }
};

C 解法, 执行用时: 3ms, 内存消耗: 396KB, 提交时间: 2022-08-02

/**
 * struct TreeNode {
 *	int val;
 *	struct TreeNode *left;
 *	struct TreeNode *right;
 * };
 *
 * C语言声明定义全局变量请加上static,防止重复定义
 */
/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param root TreeNode类 
 * @return int整型一维数组
 * @return int* returnSize 返回数组行数
 */
int i=0;
int a[];
void pre(struct TreeNode* root,int*a)
{
    if(root!=NULL)
    {
    a[i]=root->val;
    i++;
    pre(root->left,a);
    pre(root->right,a);
    }
}
int* preorderTraversal(struct TreeNode* root, int* returnSize ) {    
  pre(root,a);
    * returnSize=i;
    return a;
}

上一题