题解 | #二叉树的前序遍历#

二叉树的前序遍历

http://www.nowcoder.com/practice/5e2135f4d2b14eb8a5b06fab4c938635

题意理解

输入一个二叉树,通过先序遍历将节点值依次放入数组并输出。

方法一

递归
由于是先序遍历,我们先输出当前节点的值,再遍历其左孩子,最后遍历其右孩子。对于每个孩子也是同样的操作。递归边界是当前节点为空。

先序遍历的顺序示意图如下: alt

具体代码如下:

/**
 * 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> ans;
    
    void first(TreeNode* root) {
        if (root==NULL) return;
        ans.push_back(root->val);
        first(root->left);
        first(root->right);
        return;
    }
    
    vector<int> preorderTraversal(TreeNode* root) {
        // write code here
        first(root);
        return ans;
    }
};

时间复杂度: O(N)O(N)。每一个节点都遍历了一遍,N为节点个数。
空间复杂度: O(N)O(N)。递归栈的深度在最坏情况下为N;除此之外还使用了一个数组ans记录先序遍历的结果,其长度也为N。

方法二


递归过程使用到了栈,我们也可以尝试自己用栈模拟递归。

从根节点开始,压入栈。当栈不为空时,弹出栈顶元素,先将其右子树压入栈,再将其左子树压入栈。不断重复以上操作。因为栈底元素到最后才被弹出,所以先把右子树入栈才能实现先序遍历。

具体代码如下:

/**
 * 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> ans;
    
    
    vector<int> preorderTraversal(TreeNode* root) {
        // write code here
        if (root == NULL) return ans;
        stack<TreeNode*> a;
        a.push(root);
        while (!a.empty())
        {
            TreeNode *p = a.top();
            ans.push_back(p->val);
            a.pop();
            //先把右子树入栈再把左子树入栈
            if (p->right!=NULL)
            {
                a.push(p->right);
            }
            if (p->left!=NULL)
            {
                a.push(p->left);
            }
        }
        return ans;
    }
};

时间复杂度: O(N)O(N)。每一个节点都遍历了一遍,N为节点个数。
空间复杂度: O(N)O(N)。栈的深度在最坏情况下同样为N;除此之外还使用了一个数组ans记录先序遍历的结果,其长度也为N。

全部评论

相关推荐

大猪蹄子哥:1-谁教你这么写教育经历的……咱都这个学历了,很多公司要看本科、硕士,Gap Year的,你啪就给一个上大26届硕士,没了。 2-那堆奖学金揉成一行放最后得了,放前面显得你没技术自信,还是那句话,对于咱这个学历直接上重点,你这上半段看起来像个大专(无恶意 3-专业技能最好点出来细化方向,你熟悉的以太网是UDP还是TCP,是千兆还是万兆等等,多种信号处理……那你倒是说两个啊,后面空着干嘛,会的干嘛不讲 4-项目经历废话太多,描述不专业(怎么还有我,我们这种词),没有数据支撑(是婴儿还是巨人看不出来)。最后如果这些是真的XX项目、比赛,最好点出来,不然更显得像自学着玩的,或者说抄的(经典复现等于我做过 5-个人总结在咱这个分段没用
点赞 评论 收藏
分享
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务