当前位置: 首页 > news >正文

剑指offer之树专题

1、层次遍历(bfs)

非递归

每一层是按照从左到右的顺序

为了满足先遍历先出采用队列的数据结构,队列里面存放我们遍历过的节点

 

首先根节点入队,当队列不空时,出队队首元素并打印相应节点的内容。如果出队的节点有左孩子或者右孩子,则入队左孩子节点或者右孩子节点,如此循环

class Solution
{
public:
    vector<int> bfs(TreeNode *root)//返回的是一个int的vector
    {
        vector<int>res;
        queue<TreeNode *>q;//辅助队列
 
        if(root==NULL)return res;//空树返回空
        q.push(root);//将根节点入队
      
 
        while(!q.empty())
        {
            //入队
            res.push_back(q.front()->val);
            if(q.front()->left!=NULL)
            {
                q.push(q.front()->left);
            }
            if(q.front()->right!=NULL)
            {
                q.push(q.front()->right);
            }
            // 出队
            q.pop();//弹出第一个元素
        }
        return res;//只有最后才会执行这个
    }
};

2、深度优先遍历(递归)

按照遍历顺序将节点存放在容器中

遍历就像我们走路上有很多坑,一旦掉进去就是很多层,只有到底才能开始慢慢向上攀爬,小事件结束就是我们的梯子

 1、确定终止条件

如果当层遍历的节点为空的话,就是结束本层,返回上一层

if(cur == NULL) return;

 2、单层递归的逻辑:前序是中、左、右

vec.push_back(cur ->val);//中间节点插入
traversal(cur ->left,vec);//左
traversal(cur ->right,vec);//右

完整代码

lass Solution {
public:
    void preorder(TreeNode *root, vector<int> &res) {
        if (root == nullptr) return;//终止条件
        
        res.push_back(root->val);    //中
        preorder(root->left, res);   //左
        preorder(root->right, res);  //右
    }

    vector<int> preorderTraversal(TreeNode *root) {
        vector<int> res;
        preorder(root, res);
        return res;
    }
};
8

非递归

利用栈

访问到空节点的话,就会跳到上一层,然后将栈顶出

我们栈是先进后出

前序是中,右、左()

中序:左、中、右()

后续:中、左、右

//前序代码

class Solution {
public:
    vector<int> preorderTraversal(TreeNode* root) {
        vector<int> res;
        stack<TreeNode*> s;
        if(root == nullptr)  return res;

		s.push(root);  //压入根结点
        while (!s.empty()){  //入栈是 根右左
            TreeNode* node = s.top();  s.pop();
            res.push_back(node->val);                 //中
            if (node->right) stk.push(node->right);   //右
            if (node->left)  stk.push(node->left);    //左
        }

        return res;
    }
};

相关文章:

  • 单声道D类音频功率放大器 CS8683H 特点及应用
  • 算法刷题第三天:双指针--2
  • 技术分享 | 被测项目需求你理解到位了么?
  • 宿主物种丨Jackson告诉你选择二抗的注意事项
  • centos8安装cobbler3.2
  • 网络编程-----socket函数
  • SpringBoot的自动装配进阶
  • 高通平台Android 蓝牙调配置手试和册-- OPP File Transmission Failure
  • STC15单片机内部RAM讲解
  • zemax---Ray Aberration(光线光扇图)
  • Polygon zkEVM Arithmetic状态机
  • 汽车毫米波雷达测试与测量解决方案
  • 网络编程--sockaddr 与 sockaddr_in
  • HashMap底层分析
  • 《工程伦理与学术道德》之《导论》
  • 【技术性】Search知识
  • axios请求、和返回数据拦截,统一请求报错提示_012
  • Druid 在有赞的实践
  • golang 发送GET和POST示例
  • Invalidate和postInvalidate的区别
  • python 装饰器(一)
  • TypeScript迭代器
  • uva 10370 Above Average
  • Vue UI框架库开发介绍
  • 安卓应用性能调试和优化经验分享
  • 短视频宝贝=慢?阿里巴巴工程师这样秒开短视频
  • 分布式任务队列Celery
  • 构造函数(constructor)与原型链(prototype)关系
  • 关于 Linux 进程的 UID、EUID、GID 和 EGID
  • 开年巨制!千人千面回放技术让你“看到”Flutter用户侧问题
  • 使用 Node.js 的 nodemailer 模块发送邮件(支持 QQ、163 等、支持附件)
  • 树莓派 - 使用须知
  • 思否第一天
  • 微服务入门【系列视频课程】
  • 微信端页面使用-webkit-box和绝对定位时,元素上移的问题
  • 想使用 MongoDB ,你应该了解这8个方面!
  • 一道闭包题引发的思考
  • AI算硅基生命吗,为什么?
  • Unity3D - 异步加载游戏场景与异步加载游戏资源进度条 ...
  • ​​​​​​​GitLab 之 GitLab-Runner 安装,配置与问题汇总
  • ​​​​​​​Installing ROS on the Raspberry Pi
  • ​Linux·i2c驱动架构​
  • # Pytorch 中可以直接调用的Loss Functions总结:
  • #pragma data_seg 共享数据区(转)
  • #pragma multi_compile #pragma shader_feature
  • #vue3 实现前端下载excel文件模板功能
  • (Matalb时序预测)PSO-BP粒子群算法优化BP神经网络的多维时序回归预测
  • (pojstep1.1.2)2654(直叙式模拟)
  • (附源码)ssm高校运动会管理系统 毕业设计 020419
  • (附源码)ssm教师工作量核算统计系统 毕业设计 162307
  • (推荐)叮当——中文语音对话机器人
  • (原+转)Ubuntu16.04软件中心闪退及wifi消失
  • (原创)攻击方式学习之(4) - 拒绝服务(DOS/DDOS/DRDOS)
  • (转)VC++中ondraw在什么时候调用的
  • (转)负载均衡,回话保持,cookie