数据结构(Java):力扣 二叉树面试OJ题(二)【进阶】

news2024/9/22 13:26:35

目录

💎 1、题一:二叉树的层序遍历

🌟 1.1 思路1(递归求解) 

🌟 1.1.1 思路1代码

🔆 1.2 思路2(队列求解)

🔆 1.2.1 思路2代码 

 💎 2、题二:判断是否为完全二叉树

🌟 2.1 思路分析

  🌟 2.2 代码

💎  3、题三:求二叉树中节点的最近公共祖先 

🌟 3.1 思路分析

 🌟 3.2 代码

💎  4、题四:根据二叉树创建字符串

🌟 4.1 思路分析

 🌟 4.2 代码

💎  5、题五:二叉树前序遍历递归实现与非递归实现

🌟 5.1 递归实现->思路分析

 🌟 5.1.1 递归实现->代码

🔆 5.2 非递归实现->思路分析

​编辑 🔆 5.2.1 非递归实现->代码 

💎  6、题六:二叉树中序遍历递归实现与非递归实现

🌟 6.1 递归实现->代码

🔆 6.2 非递归实现->代码

 💎  7、题七:二叉树后序遍历递归实现与非递归实现

🌟 7.1 递归实现->代码

🔆 7.2 非递归实现->思路分析

 🔆 7.2.1 非递归实现->代码 


💎 1、题一:二叉树的层序遍历

. - 力扣(LeetCode)

层序遍历, 即从上到下,从左到右,一层一层的将数据遍历一遍。 

🌟 1.1 思路1(递归求解) 

  1. 首先,根据上篇求树高度的方法,求出二叉树的高度。接着,实例化出高度个一维顺序表添加到二维顺序表中。
  2. 记录好每层数据的层数,根据层数并按顺序来将来将数据添加到二维顺序表的第几行中(记录层数来放入数据,是解题关键点!!!)。
  3. 默认根节点是第0层,与顺序表下标相对应。
  4. 这里以前序遍历的思想递归,添加各层数据。

🌟 1.1.1 思路1代码

class Solution {
    public List<List<Integer>> levelOrder(TreeNode root) {
        List<List<Integer>> listVal = new ArrayList<>();
        if(root == null) {
            //注意:若根节点为空,要返回空的顺序表
            return listVal;
        };
        int height = treeHeight(root);
        for(int i = 0; i < height; i++) {
            List<Integer> list = new ArrayList<>();
            listVal.add(list);
        }
        //根节点的层数默认为0
        addNode(root,0,listVal);
        return listVal;
    }
    //求树高度
    public int treeHeight(TreeNode root) {
        if(root == null) return 0;
        return Math.max(treeHeight(root.left),treeHeight(root.right)) + 1;
    }
    public void addNode(TreeNode root,int level,List<List<Integer>> listVal) {
        if(root == null) {
            return;
        }
        //以前序遍历的思想,根据层数来将数据添加到该行的顺序表中
        listVal.get(level).add(root.val);
        addNode(root.left,level+1,listVal);
        addNode(root.right,level+1,listVal);
    } 
}


🔆 1.2 思路2(队列求解)

  1. 首先创建一个队列,将根节点放入队列当中
  2. 每次循环前记录队列中元素个数size,依次出队size个元素,每次出队的元素(节点)都要判断其左右子树是否为空,若不为空则添加到队列中
  3. 将每次出队的元素的val值添加到一维顺序表中,size个元素全部出队完后,将这个一维顺序表添加到二维顺序表中,也就是说,每size个出队的元素都是同一层的节点
  4. 循环以上过程,直至元素全部添加至二维顺序表中(队列为空

🔆 1.2.1 思路2代码 

class Solution {
    public List<List<Integer>> levelOrder(TreeNode root) {
        List<List<Integer>> listVal = new ArrayList<>();
        if (root == null) {
            //注意:若根节点为空,要返回空的顺序表
            return listVal; 
        }
        Queue<TreeNode> queue = new LinkedList<>();
        queue.offer(root);
        //队列空时,说明节点已全部添加到二维顺序表中
        while (!queue.isEmpty()) {
            int size = queue.size();
            //存储每一层节点的顺序表
            List<Integer> list = new ArrayList<>();
            //将队列中的size个元素依次出队,
            //并判断其左右子树是否为空,若不为空则添加到队列中
            while (size != 0) {
                TreeNode out = queue.poll();
                list.add(out.val);
                if (out.left != null) {
                    queue.offer(out.left);
                }
                if (out.right != null) {
                    queue.offer(out.right);
                }
                size--;
            }
            //将每一层的一维顺序表添加到二维顺序表中
            listVal.add(list);
        }
        return listVal;
    }
}

 💎 2、题二:判断是否为完全二叉树

 本题无链接,

题目即:给出一棵树的根节点,判断是否为完全二叉树。

🌟 2.1 思路分析

这题的解题思路和上一题队列求解差不多,都是借助队列这一数据结构:

  1. 首先,创建队列,放入根节点。
  2. 将一个元素出队,cur接收出队元素,判断cur是否为空,若cur不为空,则将其左右孩子放入队列中(若左右子树为null,也要将null入队),循环这一过程。
  3. 当cur为null时结束循环(出队的是null,cur接收,此时cur为null),此时,只要判断队列中的剩余元素是否存在非null元素:若剩余元素全为null则说明该树为完全二叉树;若剩余元素存在非null元素则说明该树不为完全二叉树。

  🌟 2.2 代码

boolean isCompleteTree(TreeNode root) {
        if(root == null) {
            return true;
        }
        //创建队列 添加根节点
        Queue<TreeNode> queue = new LinkedList<>();
        queue.offer(root);
        //当cur不为空时,添加其左右孩子
        TreeNode cur = root;
        while (cur != null) {
            cur = queue.poll();
            if (cur != null) {
                queue.offer(cur.left);
                queue.offer(cur.right);
            }
        }
        //cur为空时,判断队列中是否有非空元素
        //若剩余元素全为null则说明该树为完全二叉树;
        // 若剩余元素存在非null元素则说明该树不为完全二叉树。
        boolean flg = false;
        while (!queue.isEmpty()) {
            TreeNode cur2 = queue.poll();
            if (cur2 != null) {
                flg = true;
            }
        }
        if (flg == true) {
            return false;
        }else {
            return true;
        }
    }

💎  3、题三:求二叉树中节点的最近公共祖先 

. - 力扣(LeetCode)

🌟 3.1 思路分析

  • ①:当p、q在根节点的左右子树上时,祖先就是这个根节点
  • ②:当p、q都在根节点的右子树上时,由于节点的祖先可以是它自己,所以祖先就是p或q本身
  • ③:当p、q都在根节点的左子树上时,由于节点的祖先可以是它自己,所以祖先就是p或q本身
  • 以前序遍历思想递归,若遇见p、q节点便返回
  • 若左右子树都有返回值,说明祖先就是这个根节点;(对于第一层的根节点)若只有左子树有返回值,说明p、q均在左子树上,返回的节点就是最近祖先;(对于第一层的根节点)若只有右子树有返回值,说明p、q均在右子树上,返回的节点就是最近祖先。

 🌟 3.2 代码

class Solution {
    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
        return findNode( root,  p,  q);

    }
    public TreeNode findNode(TreeNode root, TreeNode p, TreeNode q) {
        if(root == null) {
            return null;
        }
        //先判断根节点是否为p、q节点
        if(root.val == p.val || root.val == q.val) {
            return root;
        }
        //查找左右子树
        TreeNode leftNode = findNode(root.left,p,q);
        TreeNode rightNode = findNode(root.right,p,q);   

        //若左右子树都有返回值,说明祖先就是这个根节点    
        if(leftNode != null && rightNode != null) {
            return root;
        }
        //在左树上找到了
        if(leftNode != null && rightNode == null) {
            return leftNode;
        }
        //在右树上找到了
        if(rightNode != null && leftNode == null) {
            return rightNode;
        }
        return null;
    }
}

💎  4、题四:根据二叉树创建字符串

. - 力扣(LeetCode)

🌟 4.1 思路分析

  1. 借助StringBuffer拼接字符串,最后返回字符串
  2. 以前序遍历思想递归
  3. 拼接当前根节点,判断根节点的左孩子是否为空,若左孩子不为空则拼接"(",并递归左子树;若左孩子为空且右孩子为空,则直接返回即可;若左孩子为空但右孩子不为空,注意!!!此时应该拼接"()",继续递归右子树。
  4. 若右孩子为空,则直接返回;若右孩子不为空,则拼接"("并递归右子树。
  5. 在根节点的左右子树完成即递归回退后拼接相应的")"
  6. 调用toString方法返回字符串

 🌟 4.2 代码

 class Solution {
    StringBuilder stringBuilder = new StringBuilder();
    public String tree2str(TreeNode root) {
        tree2strChild(root);
        return stringBuilder.toString();
    }
    public void tree2strChild(TreeNode root) {
        if(root == null) {
            return ;
        }
        stringBuilder.append(root.val);
           if(root.left != null) {
            //左子树不为空,则必然添加"("
            stringBuilder.append("(");
            //递归左子树
            tree2strChild(root.left);
            //该节点左子树完,则拼接")"
            stringBuilder.append(")");
        }else {
            //左子树为空,且右子树为空,直接返回
            if(root.right == null) {
                return;
            }else {
            //左子树为空,但右子树不为空,需拼接"()"
            stringBuilder.append("()");
            }
        }
        //若右孩子为空,则直接返回;若右孩子不为空,则拼接"("并递归右子树
        if (root.right != null) {
            stringBuilder.append("(");
            tree2str(root.right);
            stringBuilder.append(")");
        }else {
            return;
        }
    }
}

💎  5、题五:二叉树前序遍历递归实现与非递归实现

 . - 力扣(LeetCode)

🌟 5.1 递归实现->思路分析

递归实现前序遍历的思想很简单:就是先将根节点的数据放入顺序表中,再将左子树的数据放入顺序表中, 再将右子树的数据放入顺序表中。

 🌟 5.1.1 递归实现->代码

class Solution {
    public List<Integer> preorderTraversal(TreeNode root) {
        List<Integer> list = new ArrayList<>();
        if(root == null) {
            return list;
        }
        list.add(root.val);
        List<Integer> leftList = preorderTraversal(root.left);
        list.addAll(leftList);

        List<Integer> rightList = preorderTraversal(root.right);
        list.addAll(rightList);

        return list;
    }
}

🔆 5.2 非递归实现->思路分析

 非递归实现遍历,我们需要借助一种数据结构--->

注意:本题要求将数值放入顺序表中,返回顺序表。故这里访问根节点时,对根节点的操作是将根节点的val值添加到顺序表中。 

  1. 创建栈和顺序表,将根节点赋值给cur
  2. 将cur入栈并将cur的val值添加到顺序表中,cur更新为cur的left,接着将cur入栈并将cur的val值添加到顺序表中。循环操作,直到cur为空
  3. 此时cur为空,pop弹出栈顶元素赋给top,将cur更新为top.right;若top.right为空,即更新的cur为空,则继续弹出栈顶元素(top接收),直至cur不为空。
  4. 此时cur不为空,循环2、3步骤,直至栈中元素为空,说明树中元素已按照前序遍历的方式全部添加到了顺序表中。

 🔆 5.2.1 非递归实现->代码 

class Solution {
    public List<Integer> preorderTraversal(TreeNode root) {
        List<Integer> list = new ArrayList<>();
        Stack<TreeNode> stack = new Stack<>();
        TreeNode cur = root;

        //注意这里的循环条件
        //因为后续cur为空时要弹出栈顶元素,故栈不能为空
        //且一开始时栈为空,故cur不为空就可进入循环
        //当栈空且cur为空,说明前序遍历已完成
        while (cur != null || !stack.isEmpty()) {
            //cur不为空就要进栈,并添加进顺序表
            //cur = cur.left
            while (cur != null) {
                stack.push(cur);
                list.add(cur.val);
                cur = cur.left;
            }
            //当cur为空时,弹出栈顶元素(top),赋给cur其右子树
            //若cur还是为空(top.right为空),循环过来继续弹出元素,并赋给cur新的top.right
            TreeNode top = stack.pop();
            cur = top.right;
        }
        return list;
    }
}

💎  6、题六:二叉树中序遍历递归实现与非递归实现

. - 力扣(LeetCode)

中序遍历的实现,不管是在递归实现上还是在非递归实现上,和前序遍历的思想都是相同的,只是访问根节点的时机有所不同。

🌟 6.1 递归实现->代码

class Solution {
    public List<Integer> inorderTraversal(TreeNode root) {
        List<Integer> list = new ArrayList<>(); 
        if(root == null) {
            return list;
        }
        

        List<Integer> listLeft = inorderTraversal(root.left);
        list.addAll(listLeft);

        list.add(root.val);

        List<Integer> listRight = inorderTraversal(root.right);
        list.addAll(listRight);

        return list;
    }
}

🔆 6.2 非递归实现->代码

class Solution {
    public List<Integer> inorderTraversal(TreeNode root) {
        List<Integer> list = new ArrayList<>();
        Stack<TreeNode> stack = new Stack<>();
        TreeNode cur = root;

        //注意这里的循环条件
        //因为后续cur为空时要弹出栈顶元素,故栈不能为空
        //且一开始时栈为空,故cur不为空就可进入循环
        //当栈空且cur为空,说明前序遍历已完成
        while (cur != null || !stack.isEmpty()) {
            //cur走左子树
            while (cur != null) {
                stack.push(cur);

                cur = cur.left;
            }
            //当cur为空时,弹出栈顶元素(top),添加进顺序表,赋给cur其右子树
            //若cur还是为空(top.right为空),循环过来继续弹出元素,并赋给cur新的top.right
            TreeNode top = stack.pop();
            list.add(top.val);
            cur = top.right;
        }
        return list;
    }
}

 💎  7、题七:二叉树后序遍历递归实现与非递归实现

. - 力扣(LeetCode)

 后序遍历的实现,在递归上,与前序、中序遍历的思想是相同的,在此不再赘述。

而在非递归的实现上,后序遍历需要额外注意几点。

🌟 7.1 递归实现->代码

class Solution {
    public List<Integer> postorderTraversal(TreeNode root) {
        List<Integer> list = new ArrayList<>();
        if(root == null) {
            return list;
        }

        List<Integer> list1 = postorderTraversal(root.left);
        list.addAll(list1);
        List<Integer> list2 = postorderTraversal(root.right);
        list.addAll(list2);
        list.add(root.val);
        return list;
    }
}

🔆 7.2 非递归实现->思路分析

 后序遍历在非递归的实现上,需要额外注意几点:

  1. 当cur为空时,不可直接将栈顶元素弹出并添加进顺序表(或打印,只是访问根节点时的操作不同)
  2. 因为栈顶元素即根节点,后序遍历,需要判断栈顶元素的右孩子是否为空,若为空,才可弹出栈顶元素并打印;若右孩子不为空,需要先对右子树中的元素进行入栈和打印操作
  3. 而当栈顶元素的右孩子不为空时,我们又需要额外注意一点!!!当栈顶元素的右孩子不为空时,那就说明这个栈顶元素将永远不能出栈,会造成死循环!!!我们需要记录进过栈的元素,避免死循环的出现!!! 

发生死循环过程如下图:

 🔆 7.2.1 非递归实现->代码 

class Solution {
    public List<Integer> postorderTraversal(TreeNode root) {
        List<Integer> list = new ArrayList<>();
        Stack<TreeNode> stack = new Stack<>();
        TreeNode cur = root;

        //prev指向被打印过的节点
        TreeNode prev = null;
        //注意这里的循环条件
        //因为后续cur为空时要弹出栈顶元素,故栈不能为空
        //且一开始时栈为空,故cur不为空就可进入循环
        //当栈空且cur为空,说明前序遍历已完成
        while (cur != null || !stack.isEmpty()) {
            //cur走左子树
            while (cur != null) {
                stack.push(cur);
                cur = cur.left;
            }

            //当cur为空时,不可直接将栈顶元素弹出和添加进顺序表
            //要判断栈顶元素(根节点)是否有右孩子
            //若右孩子为空可以弹出和添加
            //若右孩子不为空,需要先将右子树的元素入栈并添加
            TreeNode top = stack.peek();
            //当栈顶元素的右孩子入过栈时,此时栈顶元素可以弹出并添加进顺序表
            if(top.right == null || top.right == prev) {
                stack.pop();
                list.add(top.val);
                prev = top;
            }else {
                cur = top.right;
            }
        }
        return list;
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1932887.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2024.7.16日 最新版 docker cuda container tookit下载!

nvidia官方指导 https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/install-guide.html 其实就是这几个命令&#xff0c;但是有墙&#xff1a; curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/shar…

【JavaEE】-- 网络编程基础概念(详解)

&#x1f387;&#x1f389;&#x1f389;&#x1f389;点进来你就是我的人了 博主主页&#xff1a;&#x1f648;&#x1f648;&#x1f648;戳一戳&#xff0c;欢迎大佬指点&#xff01; 人生格言: 当你的才华撑不起你的野心的时候,你就应该静下心来学习! 欢迎志同道合的朋友…

AV1技术学习: Compound Prediction

一、双向 Compound Prediction AV1支持两个参考帧的预测通过多种复合模式线性组合。复合预测公式为 其中&#xff0c;权重m(x, y) is scaled by 64 以进行整数计算&#xff0c;R1(x, y)和R2(x, y)表示两个参考块中位于(x, y)的像素。P(x, y)将按比例缩小 1/64 以形成最终的预测…

十五、【机器学习】【监督学习】- 神经网络回归

系列文章目录 第一章 【机器学习】初识机器学习 第二章 【机器学习】【监督学习】- 逻辑回归算法 (Logistic Regression) 第三章 【机器学习】【监督学习】- 支持向量机 (SVM) 第四章【机器学习】【监督学习】- K-近邻算法 (K-NN) 第五章【机器学习】【监督学习】- 决策树…

MyPostMan 迭代文档管理、自动化接口闭环测试工具(自动化测试篇)

MyPostMan 是一款类似 PostMan 的接口请求软件&#xff0c;按照 项目&#xff08;微服务&#xff09;、目录来管理我们的接口&#xff0c;基于迭代来管理我们的接口文档&#xff0c;文档可以导出和通过 url 实时分享&#xff0c;按照迭代编写自动化测试用例&#xff0c;在不同环…

定制QCustomPlot 带有ListView的QCustomPlot 全网唯一份

定制QCustomPlot 带有ListView的QCustomPlot 文章目录 定制QCustomPlot 带有ListView的QCustomPlot摘要需求描述实现关键字: Qt、 QCustomPlot、 魔改、 定制、 控件 摘要 先上效果,是你想要的,再看下面的分解,顺便点赞搜藏一下;不是直接右上角。 QCustomPlot是一款…

Spring中IoC容器和Bean

目录 IoC(Inversion of Control)控制反转思想 Spring技术对IoC思想的实现 DI(Dependency Injection)依赖注入 目标 最终效果 IoC入门案例 传统方法&#xff0c;不使用IoC思想调用dao层 使用IoC思想调用dao层 第一步&#xff1a;导入Spring坐标 第二步&#xff1a;创建…

stm32:CAN通讯

目录 介绍 协议层 CAN的 帧/报文 种类 数据帧 远程帧&#xff08;遥控帧&#xff09; 错误帧 过载帧 帧间隔 总线仲裁 stm32的CAN外设 工作模式 测试模式 功能框图 时序 标准时序 例子 环回静默模式测试 寄存器代码 HAL版本 介绍 一种功能丰富的车用总线标…

【ffmpeg命令入门】重新编码媒体流、设置码率、设置帧速率

文章目录 前言ffmpeg的描述重新编码媒体流重新编码媒体流的命令ffmpeg支持的媒体流 设置视频码率视频码率是什么设置视频的码率 设置文件帧数率帧数率是什么ffmpeg设置帧数率 总结 前言 在数字媒体处理领域&#xff0c;ffmpeg是一款非常强大的工具&#xff0c;它可以用来进行媒…

自动化产线 搭配数据采集监控平台 创新与突破

自动化产线在现在的各行各业中应用广泛&#xff0c;已经是现在的生产趋势&#xff0c;不同的自动化生产设备充斥在各行各业中&#xff0c;自动化的设备会产生很多的数据&#xff0c;这些数据如何更科学化的管理&#xff0c;更优质的利用&#xff0c;就需要数据采集监控平台来完…

解决Ubuntu 20.04下外接显示屏无信号问题【多次尝试无坑完整版!!!】

解决Ubuntu 20.04下外接显示屏无信号问题【多次尝试无坑完整版&#xff01;&#xff01;&#xff01;】 一、引言 作为一名开发者&#xff0c;我经常在Windows和Ubuntu之间切换&#xff0c;以满足不同的开发需求。最近&#xff0c;我在使用惠普暗影精灵9&#xff08;搭载RTX 4…

HLS加密技术:保障流媒体内容安全的利器

随着网络视频内容的爆炸性增长&#xff0c;如何有效保护视频内容的版权和安全成为了一个亟待解决的问题。HLS&#xff08;HTTP Live Streaming&#xff09;加密技术作为一种先进的流媒体加密手段&#xff0c;凭借其高效性和安全性&#xff0c;在直播、点播等场景中得到了广泛应…

隐性行为克隆——机器人的复杂行为模仿学习的新表述

介绍 论文地址&#xff1a;https://arxiv.org/pdf/2109.00137.pdf 源码地址&#xff1a;https://github.com/opendilab/DI-engine.git 近年来&#xff0c;人们对机器人学习进行了大量研究&#xff0c;并取得了许多成果。其中&#xff0c;模仿学习法尤其受到关注。这是一种从人…

JavaEE初阶 - IO、存储、硬盘、文件系统相关常识 (二)

&#x1f387;&#x1f389;&#x1f389;&#x1f389;点进来你就是我的人了 博主主页&#xff1a;&#x1f648;&#x1f648;&#x1f648;戳一戳&#xff0c;欢迎大佬指点&#xff01; 人生格言: 当你的才华撑不起你的野心的时候,你就应该静下心来学习! 欢迎志同道合的朋友…

appium2.0 执行脚本遇到的问题

遇到的问题&#xff1a; appium 上的日志信息&#xff1a; 配置信息 方法一 之前用1.0的时候 地址默认加的 /wd/hub 在appium2.0上&#xff0c; 服务器默认路径是 / 如果要用/wd/hub 需要通过启动服务时设置基本路径 appium --base-path/wd/hub 这样就能正常执行了 方法二…

HarmonyOS NEXT学习——@BuilderParam装饰器

初步理解&#xff0c;相当于VUE的插槽slot Builder function overBuilder() {}Component struct Child {label: string ChildBuilder customBuilder() {}Builder customChangeThisBuilder() {}BuilderParam customBuilderParam: () > void this.customBuilder; // 使用自定…

【TDA4板端部署】基于 Pytorch 训练并部署 ONNX 模型在 TDA4

1 将torch模型转onnx模型 Ti转换工具只支持以下格式&#xff1a; Caffe - 0.17 (caffe-jacinto in gitHub) Tensorflow - 1.12 ONNX - 1.3.0 (opset 9 and 11) TFLite - Tensorflow 2.0-Alpha 基于 Tensorflow、Pytorch、Caffe 等训练框架&#xff0c;训练模型&#xff1a;选择…

Hadoop3:HDFS存储优化之小文件归档

一、情景说明 我们知道&#xff0c;NameNode存储一个文件元数据&#xff0c;默认是150byte大小的内存空间。 那么&#xff0c;如果出现很多的小文件&#xff0c;就会导致NameNode的内存占用。 但注意&#xff0c;存储小文件所需要的磁盘容量和数据块的大小无关。 例如&#x…

【5G Sub-6GHz模块】专为IoT/eMBB应用而设计的RG520NNA、RG520FEB、RG530FNA、RG500LEU 5G模组

推出全新的5G系列模组&#xff1a; RG520NNADB-M28-SGASA RG520NNADA-M20-SGASA RG520FEBDE-M28-TA0AA RG530FNAEA-M28-SGASA RG530FNAEA-M28-TA0AA RG500LEUAA-M28-TA0AA ——明佳达 1、5G RG520N 系列——专为IoT/eMBB应用而设计的LGA封装模块 RG520N 系列是一款专为 IoT…

Kafka Producer发送消息流程之Sender发送线程和在途请求缓存区

文章目录 1. Sender发送数据1. 发送数据的详细过程&#xff1a;2. 关键参数配置 2. 在途请求缓存区 1. Sender发送数据 Sender线程负责将已经在RecordAccumulator中准备好的消息批次发送到Kafka集群。虽然消息在RecordAccumulator中是按照分区组织的&#xff0c;但Sender线程在…