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

二叉树的前序遍历

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

方法一:递归

二叉树的前序遍历顺序:根节点->左节点->右节点。先保存根节点的值,依次进入左右子树进行递归。

时间复杂度:o(n)。需要遍历二叉树的所有节点,需要o(n)。

空间复杂度:o(n)。需要开辟空间保存前序遍历的节点值。

class Solution {
  public:
    void pre_search(TreeNode* root, vector<int>& pre_tree) {
	  	//当节点为空时返回
        if (root == nullptr)
            return;

        //保存根节点的值
        pre_tree.push_back(root->val);
        //遍历左节点
        pre_search(root->left, pre_tree);
        //遍历右节点
        pre_search(root->right, pre_tree);
    }
    vector<int> preorderTraversal(TreeNode* root) {
        vector<int> pre_tree;
        pre_search(root, pre_tree);
        return pre_tree;
    }
};

方法二:栈(非递归)

根据栈先进后出的特性,本题可以将递归转换为栈来求解。

二叉树的前序遍历顺序:根节点->左节点->右节点。根据栈先进后出的特性,所以需要先将结点的右结点压入栈中,再将左结点压入栈中。

时间复杂度:o(n)。

空间复杂度:o(n)。

class Solution {
  public:
    vector<int> preorderTraversal(TreeNode* root) {
        vector<int> pre;
        //特殊情况处理
        if (root == nullptr)
            return pre;
		//辅助栈
        stack<TreeNode*> temp;
        temp.push(root);
        
        while (!temp.empty()) {
            TreeNode* node = temp.top();
		  	//每次栈顶就是写入到数组中的元素
            pre.push_back(node->val);
            temp.pop();
            //先将右结点压入栈中,再将左结点压入栈中
            if (node->right != nullptr)
                temp.push(node->right);
            if (node->left != nullptr)
                temp.push(node->left);
        }

        return pre;
    }
};

刷题题解(c++) 文章被收录于专栏

算法题题解(c++)

全部评论

相关推荐

03-03 23:12
已编辑
北京邮电大学 Java
书海为家:我来给一点点小建议,因为毕竟还在学校不像工作几年的老鸟有丰富的项目经验,面试官在面试在校生的时候更关注咱们同学的做事逻辑和思路,所以最好在简历中描述下自己做过项目的完整过程,比如需求怎么来的,你对需求的解读,你想到的解决办法,遇到困难如何找人求助,最终项目做成了什么程度,你从中收获了哪些技能,你有什么感悟。
你的简历改到第几版了
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务