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

wordpress页面中添加小工具栏seo搜索排名优化

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

一、题目内容

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

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

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

二、题目分析

输入和输出

输入:

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

相关文章:

  • 韵达快递小网站怎么做网站建设教程
  • 温州自助模板建站网页制作软件免费版
  • wordpress 更改编辑器北京seo招聘网
  • 网站怎么申请支付宝网站seo搜索引擎的原理是什么
  • 常州网站建设效果苏州网站建设开发公司
  • 无锡网站建设技术友情链接导航
  • wordpress 工作流程杭州seo网站
  • 一级A做爰片安全网站新闻今天最新消息
  • html5网站基础做网站建网站公司
  • 有网站建设需求的网站我想接app注册推广单
  • 郴州企业网站建设制作免费网站 推广网站
  • 周口航迪科技网站建设公司怎么样来几个关键词兄弟们
  • dw做网站鼠标经过图像企业员工培训课程有哪些
  • 汉口网站建设小红书广告投放平台
  • 好网站建设公司台州seo排名扣费
  • 免费软件制作网站模板醴陵网站制作
  • 带会员中心 wordpress 主题北京百度推广优化
  • 在线免费建网站网站制作详细流程
  • 华人汇和科技园建设有限公司网站免费外链网站
  • 上海做网站最专业无锡百度seo优化
  • 网站建设公司怎么运营网站制作公司
  • 临汾网站建设淘宝店铺推广方法
  • 英文网站模板上海百网优seo优化公司
  • 做网站学什么软件西安seo教程
  • 能打开那种网站的手机浏览器网上的推广公司
  • 建一个wordpress网站成本广州营销网站建设靠谱
  • 做网站用什么软件ps字体大连seo顾问
  • 360免费创建个人网站西安seo公司
  • 高明区做网站推广软件有哪些
  • 做ae动图的网站网址导航