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

网站新闻被百度收录北京市建设工程信息网官方网站

网站新闻被百度收录,北京市建设工程信息网官方网站,免费wordpress资源,柳州网站seo网站s剑指offerWeek1 周五:重建二叉树 题目链接:重建二叉树 输入一棵二叉树前序遍历和中序遍历的结果,请重建该二叉树。注意:二叉树中每个节点的值都互不相同; 输入的前序遍历和中序遍历一定合法; 数据范围 树中节点数量…

剑指offerWeek1

周五:重建二叉树

题目链接:重建二叉树

输入一棵二叉树前序遍历和中序遍历的结果,请重建该二叉树。注意:二叉树中每个节点的值都互不相同;
输入的前序遍历和中序遍历一定合法;
数据范围
树中节点数量范围 [0,100]
。样例
给定:
前序遍历是:[3, 9, 20, 15, 7]
中序遍历是:[9, 3, 15, 20, 7]返回:[3, 9, 20, null, null, 15, 7, null, null, null, null]
返回的二叉树如下所示:3/ \9  20/  \15   7

AC代码

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode(int x) : val(x), left(NULL), right(NULL) {}* };*/
class Solution {
public:unordered_map<int, int> map;TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {for (int i = 0; i < inorder.size(); i ++ ) map[inorder[i]] = i;return dfs(preorder, inorder, 0, preorder.size() - 1, 0, inorder.size() - 1);}TreeNode* dfs(vector<int>& preorder, vector<int>& inorder, int pl, int pr, int il, int ir){if (pl > pr) return nullptr;auto node = new TreeNode(preorder[pl]);int k = map[node->val];node->left = dfs(preorder, inorder, pl + 1, pl + k - il, il, k - 1);node->right = dfs(preorder, inorder, pl + k - il + 1, pr, k + 1, ir);return node;}
};

思路:

整体思路

要时刻牢记前序遍历、中序遍历的特点
前序:第一个遍历的一定是根节点
中序遍历:在根节点的左边一定是左子树,右边则是右子树那么两个性质结合,可以从前序遍历中找到根节点
然后再从中序遍历中,根据根节点划分左右子树
在左右子树中递归以上步骤,则可以重建二叉树本题还有一个难点:
当知道根节点以后,如何划分左右子树
别说什么:哎呀中序遍历知道根节点,左边的不就是左子树吗
注意,我这里指的是:在前序遍历的数集中划分左右子树
这里是利用左右子树区间长度相等得出区间边界

代码思路

  • 利用map构造出中序遍历的值能索引到值对应的下标(为了更好的找到根节点)
  • 递归,递归的条件是:前序遍历集存在
    • 构造根节点
    • 找到根节点的下标值
    • 在左子树中递归
      • 前序遍历区间:第一个节点是pl,也是根节点,因此左子树从pl + 1开始,左子树的右端点待定
      • 中序遍历的区间:左端点为il,右端点为根节点的索引值 - 1
    • 在右子树中递归
      • 右子树
        • 前序遍历区间:左端点待定,右端点显然是pr
        • 中序遍历的区间:左端点为根节点的索引值 + 1,右端点ir
  • 返回根节点

以上有两个待定的端点,也是难点

这里需要利用性质左右子树区间长度相等得出区间边界

记根节点下标为k

由于中序遍历中,左子树区间为[il, k - 1]

前序遍历[pl + 1, 待定]

记前序遍历区间的右端点为x

则有

x - pl - 1 + 1= k - 1 - il + 1

则可以解出x = k - il + pl

则前序遍历中,右子树的左端点显然为这个x + 1

部分模拟

前序遍历是:[3, 9, 20, 15, 7]
中序遍历是:[9, 3, 15, 20, 7]

  • 前序遍历第一个节点为根节点,显然为3
  • 从中序遍历中得到3,因此9是左子树,15, 20, 7是右子树
  • 左子树已经确定
    • 右子树中继续递归即可,例如,右子树的根为20(前序遍历中得出)
http://www.yayakq.cn/news/270832/

相关文章:

  • 单纯做网站的公司wordpress怎么创建自己的博客
  • 自动提卡的网站怎么做的南昌seo推广公司
  • 如何查外贸网站外链防疫大数据平台
  • oa报表网站开发wordpress百万数据
  • 凡科做网站类型应该做哪个怎么开发软件app软件
  • 网站开发所需费用支出有哪些网站后期维护收费
  • 网站页面制作多少钱如何优化网站快速排名
  • 寻找网站设计与制作免费进入正能量的网站
  • 重庆市建设厅官方网站上海造价信息网
  • 江苏建设教育网站苏宁易购
  • 有哪些炫酷的官方网站怎样维护公司网站
  • 网站群建设 中标耐克官网网站设计
  • 最好的科技网站建设wordpress占用内存过大
  • 十堰网站推广张家港企业网站设计
  • 公司网页网站建设ppt模板网站开发融资
  • 昆山市网站建设深圳市中心在哪个位置
  • 404做的好的网站网站设计建设专业服务
  • 工业信息化部网站备案福州网
  • 美丽说网站优化西安官网seo推广
  • 电子商务网站成功的关键是如何高效的完成网站建设步骤
  • 汕头整站优化wordpress更换语言
  • 小型网站如何做做跳转链接到自己的网站
  • 门户网站建设工作流程中山网页模板建站
  • 织梦网站文章发布模板下载500个企点qq大概多少钱
  • 做视频网站可以自学吗做网站流量优化都是什么
  • 5年网站续费多少钱码制作二维码官网
  • 天河建网站的公司企业网站 asp.net
  • 镇江网站制作公司wordpress主分类
  • .net开发大型网站开发中国水电建设集团港航建设有限公司网站
  • 学网站建设怎么样搭建一个网站的步骤