【递归】4.二叉树的前序遍历

1 题目解析

题目链接:二叉树的前序遍历

题目描述如下:

先回顾一下,二叉树的前序遍历的过程是:先遍历根,再遍历左子树,最后遍历右子树。 所以顺序就是:根,左子树,右子树

理清之后,继续回到之前的三步:

复制代码
第一步:挖掘出相同的子问题  (关系到具体函数头的设计)
第二步:只关心具体子问题做了什么  (关系到具体函数体怎么写,是一个宏观的过程)
第三步:找到递归的出口,防止死递归  (关系到如何跳出递归)

相同的子问题:遍历根,左子树,右子树
递归的出口:当根为空的时候递归就退出
具体的子问题做了什么:遍历根,接下来的事情交给左子树,再交给右子树

++函数头该如何写?++

下面是leetcode提供的接口:

cpp 复制代码
    vector<int> preorderTraversal(TreeNode* root) {
    }

可以看到传递的参数是TreeNode* root, 而vector<int>是返回值。所以我们函数头的参数必须包含两个,分别是TreeNode* rootvector<int>类型的参数。

例如下面这样:

cpp 复制代码
void preorder(TreeNode* root, vector<int> &res)

++函数体该如何写?++

如何写函数体,就需要关心具体的操作过程。在二叉树的前序遍历上,具体的过程就是:先遍历根,再遍历左子树,最后遍历右子树。

函数的实现:

cpp 复制代码
void preorder(TreeNode* root, vector<int> &res)
    {
        //递归的出口
        if (root == nullptr)
            return;
        
        //1.遍历根
        res.push_back(root->val);
        //2.遍历左子树
        preorder(root->left, res);
        //3.遍历右子树
        preorder(root->right, res);
    }

2 总结

全部的代码如下:

cpp 复制代码
class Solution {
public:
    vector<int> preorderTraversal(TreeNode* root) {
        vector<int> res;
        preorder(root, res);
        return res;
    }

    //函数的具体操作
    void preorder(TreeNode* root, vector<int> &res)
    {
        //递归的出口
        if (root == nullptr)
            return;
        
        //1.遍历根
        res.push_back(root->val);
        //2.遍历左子树
        preorder(root->left, res);
        //3.遍历右子树
        preorder(root->right, res);
    }
};
相关推荐
v_34836087623 小时前
Android native端 堆栈打印
android·算法
residual_fan3 小时前
【学术论文】航空发动机故障诊断智能体:基于持续对比强化学习的动态优化方法
人工智能·算法·数据挖掘·数据分析
GreenTea3 小时前
OpenAI Agents API 上手实测:一次调用把整个 agent loop 甩给 OpenAI
前端·后端·算法
深圳满意度咨询4 小时前
医院满意度数字化测评系统:从数据采集到智能决策的技术实践
算法
xiangyun615 小时前
【408数据结构 08】队列:循环队列判空判满,408年年考,一次讲清
c语言·开发语言·数据结构·c++·算法
xiangyun615 小时前
【408数据结构 06】双链表、循环链表、静态链表
c语言·开发语言·数据结构·c++·算法
OKkankan6 小时前
LangChain 能力详解!:输出解析、RAG、向量数据库与 Retriever 检索器
数据结构·python·langchain·ai应用
蓝速科技6 小时前
便民服务大厅 AI 数字人一体机场景适配与落地指南丨蓝速科技
大数据·网络·数据结构·人工智能·自然语言处理·数据分析·运维开发
302wanger7 小时前
推荐下我的两个AI信息源
算法
索尔~古德曼7 小时前
CF——错题的集合
算法