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

wordpress页面中添加小工具栏seo关键词推广优化

wordpress页面中添加小工具栏,seo关键词推广优化,wordpress 分类目录404,网站登记模板一、题目内容 题目要求根据二叉树的中序遍历序列和后序遍历序列来重建二叉树。具体来说,我们需要利用中序遍历序列和后序遍历序列的特点,通过递归的方法逐步构建出完整的二叉树。 中序遍历序列的特点是:左子树 -> 根节点 -> 右子树。后…

一、题目内容

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

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

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

二、题目分析

输入和输出

输入:

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

相关文章:

  • 日照疫情最新消息关键词是网站seo的核心工作
  • 去哪里可以做网站常用的网络营销策略有哪些
  • 平阴县建设局网站佛山做网站的公司哪家好
  • 做室内效果图的网站百度app浏览器下载
  • 帮别人起名 做ppt的网站百度代理
  • 国外游戏ui设计网站alexa
  • 网站建设费可以抵扣么全网seo
  • 网站建设网站公司哪家好如何做好网络推广销售
  • 自己做淘宝客是不是需要建网站怎么创建域名
  • 企业网站关键字优化竞价推广sem
  • 温州移动网站建设服务商宁德市高中阶段招生信息平台
  • discuz怎么做h5网站一台电脑赚钱的门路
  • 做婚恋网站要多少钱竞价托管一般多少钱
  • 网站开发方案网络营销师报考条件
  • 网站开发成功案例seo自动优化软件安卓
  • asp 网站开发 软件seo发外链工具
  • wordpress新手seo网上课程
  • 学校网站建设维护seo新手教程
  • iis服务器网站301重定向怎么做城市分站seo
  • 公众号自己做电影网站吗自助网站建设平台
  • 专业做网站公司哪家好长春seo排名优化
  • 机械毕业设计代做网站营销网站定制
  • 怎样制作网站站点百度浏览器
  • 虚拟机wordpress建站济宁seo推广
  • 网站开发培训排名google store
  • 深圳网站设计要点拉新app推广平台
  • 测评网站怎么做竞价推广公司
  • axure做网站原型尺寸上海网站建设方案
  • 网站推荐广告模板鼓楼网站seo搜索引擎优化
  • 做自媒体有哪些网站企业网络推广网站