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

沈阳三好街做网站公司世界足球排名前十名

沈阳三好街做网站公司,世界足球排名前十名,龙海市邦策网站建设平台,石狮网站建设报价文章目录 1.给一个数组构建二叉树2.从前序遍历和中序遍历构建二叉树3.二叉树中的最大路径和 1.给一个数组构建二叉树 思路:就是借助一个队列实现层序遍历的思想。 先将root节点入队列,构造左右节点后,root取出来时,将其左右孩子都…

文章目录

  • 1.给一个数组构建二叉树
  • 2.从前序遍历和中序遍历构建二叉树
  • 3.二叉树中的最大路径和


1.给一个数组构建二叉树

思路:就是借助一个队列实现层序遍历的思想。
先将root节点入队列,构造左右节点后,root取出来时,将其左右孩子都入队列。

struct TreeNode
{unique_ptr<TreeNode> left;unique_ptr<TreeNode> right;int _val;TreeNode(int val):_val(val),left(nullptr),right(nullptr){}~TreeNode(){}
};//层序遍历构建二叉树
// 1 2 3 4 5
unique_ptr<TreeNode> BuildBinaryTreeFromLevelOrder(vector<int>& nums)
{if (nums.size() == 0){cout << "nums is empty!" << endl;}unique_ptr<TreeNode> root = make_unique<TreeNode>(nums[0]);queue<TreeNode*> q;q.push(root.get());int i = 1;while (!q.empty() && i < nums.size()){TreeNode* cur = q.front();q.pop();//先处理左子树cur->left = make_unique<TreeNode>(nums[i]);q.push(cur->left.get());i++;//再处理右子树if (i < nums.size()){cur->right = make_unique<TreeNode>(nums[i]);q.push(cur->right.get());}i++;}return root;
}

2.从前序遍历和中序遍历构建二叉树

从前序遍历和中序遍历构建二叉树

在这里插入图片描述

思路:

  • 1.根据前序遍历的根,先找到中序遍历的根节点所在下标。
  • 2.然后划分成两个区间进行递归即可。

注意事项:
previ是前序中的根节点下表,用来构建当前节点的。
所以构建完根节点后, 需要++previ,到达左子树的根节点。
并且要传引用。否则回到当前递归栈这一层时,会从原位置开始向下走

class Solution {
public:TreeNode* _buildTree(vector<int>& preorder,vector<int>& inorder,int& previ,int inbegin,int inend){if(inbegin > inend)return nullptr; //子区间递归结束了TreeNode* root = new TreeNode(preorder[previ]);//1.先在中序区间找根节点下标int rooti = 0;while(rooti <= inend){if(preorder[previ] == inorder[rooti])break;++rooti;}//2.分成左右子区间分别构建子树。++previ; //根节点的下一个节点就是左子树的根了root->left = _buildTree(preorder,inorder,previ,inbegin,rooti-1);//这里不要再++prei,因为递归构建左子树时,会自己++prei,构建左子树的最后//一个节点时,会先++prei,就到右子树了。root->right = _buildTree(preorder,inorder,previ,rooti+1,inend);return root;}TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {//根据前序遍历的根,先找到中序遍历的根节点所在下标。//然后划分成两个区间进行递归即可。int previ = 0; //传参时一定是传引用,否则回到当前递归栈这一层时//会从原位置开始向下走int inbegin = 0,inend = inorder.size()-1;return _buildTree(preorder,inorder,previ,inbegin,inend);}
};

3.二叉树中的最大路径和

二叉树中的最大路径和
在这里插入图片描述

思路:二叉树中一条路的最大路径和一定是该节点的左子树的最大有效值与右子树的最大有效值的最大值的和,再加上当前节点的值。
所以:

  • 1.先求出左右子树的最大有效值,再加上当前节点的值。
  • 2.求有效值的过程,不断更新最大路径和。

这里注意两个概念:

  • 1.最大贡献值是因为左子树可能有几十条路径,需要选出最优的路径,才是最大的贡献。
    左右子树的最大贡献值加起来,再加上我当前节点的值之后,才组成最大路径和(左右都是最优的路径)。我的左子树和右子树两条路径选出来,比较后,选最大的,再加上我当前节点的值,然后向上交付,就能组成一条最优的路径。
  • 2.最大路径和就是:左右子树的最大贡献值,加上我当前节点的值,就组成了一条完整的路径。

别看这道题是困难题,如果想明白了后序遍历,就一点不难。

class Solution {int max_val = INT_MIN; //保存最大的路径和
public:int _paxPathSum(TreeNode* root){if(root == nullptr)return 0; //空节点的有效值为0//保存左右子树的最大贡献值int left_con = max(_paxPathSum(root->left),0);int right_con = max(_paxPathSum(root->right),0);//更新最大路径和max_val = max(max_val,left_con + right_con + root->val);//返回贡献值return root->val + max(left_con,right_con);}int maxPathSum(TreeNode* root) {_paxPathSum(root);return max_val;}
};
http://www.dtcms.com/wzjs/186986.html

相关文章:

  • 邯郸公司网站建设下载百度app最新版并安装
  • 广州购物网站建设价格山东百度推广代理
  • 杭州公司网站建设套餐东莞网站设计公司排名
  • 苏州品牌网站建设网络营销策划的内容
  • seo怎么才能做好seo工资一般多少
  • 网站建设的流程 步骤搜客
  • 网站 数据报表如何做百度客服24小时人工服务
  • 武汉做网站多少钱东莞互联网推广
  • 手机网站用什么软件做的好处友情链接图片
  • 四川微信网站建设什么网站都能打开的浏览器
  • 门户网站建设和运行招标公告网络营销的应用
  • 百度云服务器做php网站网站交易网
  • 如何做网站帮别人赚钱手机优化大师下载安装
  • it外包主要做什么河南seo网站多少钱
  • 静态手机网站建设的基本特点上海广告公司
  • 电脑上制作网页的软件哈尔滨seo推广
  • 端游传奇排行榜前十名夫唯seo培训
  • 企业网站推广的目的哪里有seo排名优化
  • 搭建网站流程网站友链
  • 在vs中做网站友点企业网站管理系统
  • 深圳网站商城建设miy188coo免费入口
  • 做电影网站会被捉吗win优化大师有用吗
  • 中国建设银行网站打不开做一个app软件大概要多少钱
  • 网站底部友情链接代码seo行业岗位
  • wordpress+订单号位数本溪seo优化
  • 做会员体系的网站爆款引流推广软件
  • 新闻网站给企业做专题策划沈阳网站建设公司
  • 渭南做网站价格hs网站推广
  • 上海网站建设多少产品网络营销策划方案
  • wordpress id清0宁波seo怎么做优化