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

自适应 网站百度竞价关键词质量度怎么提升

自适应 网站,百度竞价关键词质量度怎么提升,网页设计师培训需要多少钱,专业手机网站建设哪家好一、题目内容 题目要求根据二叉树的中序遍历序列和后序遍历序列来重建二叉树。具体来说,我们需要利用中序遍历序列和后序遍历序列的特点,通过递归的方法逐步构建出完整的二叉树。 中序遍历序列的特点是:左子树 -> 根节点 -> 右子树。后…

一、题目内容

题目要求根据二叉树的中序遍历序列和后序遍历序列来重建二叉树。具体来说,我们需要利用中序遍历序列和后序遍历序列的特点,通过递归的方法逐步构建出完整的二叉树。

中序遍历序列的特点是:左子树 -> 根节点 -> 右子树。后序遍历序列的特点是:左子树 -> 右子树 -> 根节点。因此,后序遍历的最后一个元素一定是根节点。通过这个根节点,我们可以在中序遍历序列中找到左子树和右子树的分界点,从而递归地构建左右子树。

我们需要声明一些变量来记录当前的遍历范围和递归的状态。在递归过程中,我们需要不断更新这些变量的值,以确保正确地构建每个子树。

二、题目分析

输入和输出

输入:

  • 两个整数数组 inorderpostorder

    • inorder:二叉树的中序遍历序列。

    • postorder:二叉树的后序遍历序列。

输出:

  • 构建好的二叉树的根节点(TreeNode 类型)。

递归函数 traversal 的逻辑

参数:

  • inorder:当前子树的中序遍历序列。

  • postorder:当前子树的后序遍历序列。

逻辑:

  1. 如果 postorder 为空,说明当前子树为空,返回 NULL

  2. 获取当前子树的根节点值 rootvalue,即 postorder 的最后一个元素。

  3. 创建根节点 root,值为 rootvalue

  4. 如果 postorder 只有一个元素,说明当前子树只有一个节点,直接返回 root

  5. 在中序遍历中找到根节点的位置 mid

  6. 根据 mid,将中序遍历序列划分为左子树和右子树。

  7. 根据左子树的大小,将后序遍历序列划分为左子树和右子树。

  8. 递归构建左子树和右子树。

  9. 返回根节点 root

三、代码解答

1. C++代码

class Solution {
public:// 主函数,用于调用递归函数并返回结果TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {if (postorder.empty() || inorder.empty()) return NULL;return traversal(inorder, postorder);}private:// 辅助递归函数TreeNode* traversal(vector<int>& inorder, vector<int>& postorder) {// 如果 postorder 为空,说明当前子树为空if (postorder.empty()) return NULL;// 获取当前子树的根节点值int rootvalue = postorder.back();TreeNode* root = new TreeNode(rootvalue);// 如果 postorder 只有一个元素,说明当前子树只有一个节点if (postorder.size() == 1) return root;// 在中序遍历中找到根节点的位置auto it = find(inorder.begin(), inorder.end(), rootvalue);int mid = distance(inorder.begin(), it);// 根据 mid,将中序遍历序列划分为左子树和右子树vector<int> leftInorder(inorder.begin(), inorder.begin() + mid);vector<int> rightInorder(inorder.begin() + mid + 1, inorder.end());// 根据左子树的大小,将后序遍历序列划分为左子树和右子树postorder.pop_back(); // 移除当前根节点vector<int> leftpostorder(postorder.begin(), postorder.begin() + leftInorder.size());vector<int> rightpostorder(postorder.begin() + leftInorder.size(), postorder.end());// 递归构建左子树和右子树root->left = traversal(leftInorder, leftpostorder);root->right = traversal(rightInorder, rightpostorder);return root;}
};

详细注释

成员变量

  • TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder):主函数,用于调用递归函数并返回结果。

  • TreeNode* traversal(vector<int>& inorder, vector<int>& postorder):辅助递归函数,用于构建当前子树。

辅助递归函数 traversal

TreeNode* traversal(vector<int>& inorder, vector<int>& postorder) {// 如果 postorder 为空,说明当前子树为空if (postorder.empty()) return NULL;// 获取当前子树的根节点值int rootvalue = postorder.back();TreeNode* root = new TreeNode(rootvalue);// 如果 postorder 只有一个元素,说明当前子树只有一个节点if (postorder.size() == 1) return root;// 在中序遍历中找到根节点的位置auto it = find(inorder.begin(), inorder.end(), rootvalue);int mid = distance(inorder.begin(), it);// 根据 mid,将中序遍历序列划分为左子树和右子树vector<int> leftInorder(inorder.begin(), inorder.begin() + mid);vector<int> rightInorder(inorder.begin() + mid + 1, inorder.end());// 根据左子树的大小,将后序遍历序列划分为左子树和右子树postorder.pop_back(); // 移除当前根节点vector<int> leftpostorder(postorder.begin(), postorder.begin() + leftInorder.size());vector<int> rightpostorder(postorder.begin() + leftInorder.size(), postorder.end());// 递归构建左子树和右子树root->left = traversal(leftInorder, leftpostorder);root->right = traversal(rightInorder, rightpostorder);return root;
}
  • 空子树检查: 如果 postorder 为空,说明当前子树为空,返回 NULL

  • 获取根节点值: 从后序遍历中获取当前子树的根节点值 rootvalue,即 postorder.back()

  • 创建根节点: 创建根节点 root,值为 rootvalue

  • 单节点子树检查: 如果 postorder 只有一个元素,说明当前子树只有一个节点,直接返回 root

  • 找到根节点在中序遍历中的位置: 在中序遍历中找到根节点的位置 mid

  • 划分中序遍历序列: 根据 mid,将中序遍历序列划分为左子树和右子树。

  • 划分后序遍历序列: 根据左子树的大小,将后序遍历序列划分为左子树和右子树。

  • 递归构建左子树和右子树: 递归调用 traversal 函数构建左子树和右子树。

  • 返回根节点: 返回构建好的根节点 root

主函数 buildTree

TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {if (postorder.empty() || inorder.empty()) return NULL;return traversal(inorder, postorder);
}
  • 调用递归函数: 从根节点开始,调用 traversal 函数,传入整个中序遍历和后序遍历的序列。

  • 返回结果: 返回构建好的二叉树的根节点。

回溯和递归的详细解释

递归

递归是一种函数调用自身的方法,用于解决复杂问题。在本题中,递归用于逐步构建二叉树的每个子树。

每次递归调用时,我们通过后序遍历的最后一个元素确定当前子树的根节点,并在中序遍历中找到该根节点的位置,从而确定左子树和右子树的范围。

递归调用的终止条件是当前子树为空(postorder.empty())。

回溯

回溯是一种在递归调用返回后恢复状态的机制。

在本题中,每次递归调用返回后,我们通过更新 postorder 和边界索引,恢复到当前子树的状态。这样可以确保每次递归返回后,状态正确,不会影响后续的递归调用。

示例

假设中序遍历序列 inorder = [4, 2, 5, 1, 6, 3, 7],后序遍历序列 postorder = [4, 5, 2, 6, 7, 3, 1]

http://www.dtcms.com/wzjs/522526.html

相关文章:

  • 想找私人做网站百度在线咨询
  • 在东莞做网站外贸营销型网站设计
  • 关键词网站建设国家卫生健康委
  • 公司做网站走什么费北京疫情又严重了
  • 外贸公司网站开发步骤百度开户代理
  • 西安哪家公司做的网站好网络平台建设及运营方案
  • 如何做网站用户活跃度爱站网
  • 搜索引擎优化有哪些优化快速排名教程
  • 自己网上开店的步骤优化推广关键词
  • 浙江网站建设推广公司哪家权威公司网页制作
  • 专门做办公的网站宁波seo网络推广
  • 网站自动采集系统网站排名优化多少钱
  • 用来做视频连接的网站网络推广一个月的收入
  • 期末成绩管理网站开发背景抖音搜索排名
  • 网站开发费用摊销吗下载班级优化大师并安装
  • 企业网站建设费计入优化网络培训
  • 浙江省职业建设学院官方网站网站查询域名入口
  • 杭州企业做网站百度快照客服人工电话
  • 中山营销网站建设费用2021年十大热点事件
  • 基于java的小说网站开发年度关键词有哪些
  • 酒店网站建设流程图乔拓云智能建站平台
  • 北京住房和建设委员会网站百度关键词查询
  • 怎样做网站吸引人临沂seo网站管理
  • wpf可以做网站吗网络营销策略有哪五种
  • 万维网注册域名后怎么导入网站东莞最新消息 今天
  • 上海网站建设收费标准10常用的网络营销方法
  • 网站开发公司源码企业品牌策划
  • 做网站哪里找万网域名官网
  • 自己做网站有名手机百度云网页版登录
  • 外贸独立站是什么意思百度网站客服电话