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

wordpress页面中添加小工具栏搜索引擎优化案例

wordpress页面中添加小工具栏,搜索引擎优化案例,石家庄网推公司,wordpress关闭rss一、题目内容 题目要求根据二叉树的中序遍历序列和后序遍历序列来重建二叉树。具体来说,我们需要利用中序遍历序列和后序遍历序列的特点,通过递归的方法逐步构建出完整的二叉树。 中序遍历序列的特点是:左子树 -> 根节点 -> 右子树。后…

一、题目内容

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

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

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

二、题目分析

输入和输出

输入:

  • 两个整数数组 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/169182.html

相关文章:

  • 上海哪家公司做网站最好百度竞价推广出价技巧
  • 青浦专业做网站扬州网络推广公司
  • 南阳市中小企业融资综合信用服务杭州关键词优化平台
  • 企业网站价格花青岛网站建设维护
  • 广告传媒公司黄页好口碑关键词优化
  • 工艺品做网站我想创建一个网络平台
  • 视频类html网站模板一个具体网站的seo优化
  • 网站制作代理平台win7系统优化工具
  • 彭州做网站百度推广入口
  • 定制开发小程序报价公司网站如何seo
  • 做网站除甲醛需不需要营业执照排行榜百度
  • 建设银行etc信用卡申请网站杭州小周seo
  • 华为云服务器怎么建设网站百度top风云榜
  • 阿里云做视频网站软文推广网
  • 网站换vps竞价托管代运营公司
  • 网站服务器爆满怎么挤进去注册城乡规划师报考条件
  • 盐城网站制作哪家好兰州搜索引擎优化
  • 浙江国有建设用地出让网站北京网站建设公司报价
  • 免费视频课程网站模板网络seo是什么工作
  • 家电网站制作千锋教育培训多少钱费用
  • 360免费wifi创建失败怎么回事搜索引擎优化结果
  • 上海建站网络科技有限公司惠州网络营销公司
  • apm搭建 wordpress整站排名优化品牌
  • 网站设计就业压力今日热点新闻大事件
  • 网站移动端权重怎么做福州网站建设方案外包
  • 绵阳东原建设工程有限公司网站seo教程下载
  • 面膜网站广告怎么做网络营销属于什么专业类型
  • 新疆生产建设兵团第六师网站百度官方下载安装
  • 枣庄市建设局网站seo网站推广可以自己搞吗
  • wordpress 菜单 固定青岛网站关键词排名优化