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

云网站建设的意义深圳关键词推广优化

云网站建设的意义,深圳关键词推广优化,北京手机网站开发,wordpress 读取副标题文章目录 如何使用递归构建二叉树1、创建一颗全新树(题1-5)2、在原有的树上新增东西(题6) 1 106 从 后序 与 中序 遍历序列构造二叉树2 105 从 前序 与 中序 遍历序列构造二叉树3 108 将有序数组转换为二叉搜索树(输入…

文章目录

  • 如何使用递归构建二叉树
    • 1、创建一颗全新树(题1-5)
    • 2、在原有的树上新增东西(题6)
  • 1 106 从 后序 与 中序 遍历序列构造二叉树
  • 2 105 从 前序 与 中序 遍历序列构造二叉树
  • 3 108 将有序数组转换为二叉搜索树(输入)
  • 4 654 最大二叉树(输入很难想)
    • 递归
    • 单调栈
  • 5 617 合并二叉树
  • 6 701 二叉搜索树中的插入操作(重点独立重做)
  • 7 450 删除二叉搜索树中的节点(中等题)
  • 8 538 把二叉搜索树转换为累加树


如何使用递归构建二叉树

1、创建一颗全新树(题1-5)

构造树一般采用前序遍历,因为先构造中间节点,然后递归构造左子树和右子树。

TreeNode* newtree = new TreeNode(val);   // 每次递归都new一个节点
if(..) return newtree;      // 直接返回这个root
newtree->left = 递归函数(....)    // 用这个新建节点的左去接递归函数的返回值
newtree->right = 递归函数(....) 
return newtree;

2、在原有的树上新增东西(题6)

删除二叉树节点,增加二叉树节点,用递归函数的返回值来完成。

输入为root
if (root == nullptr) {TreeNode* temp = new TreeNode(val);   // 在树上新加的节点return temp;
}root->left = insertIntoBST(root->left, val);
root->right = insertIntoBST(root->right, val);return root;  // return输入的root

1 106 从 后序 与 中序 遍历序列构造二叉树

1和2为同一类型,题外话:
前序和中序可以唯一确定一棵二叉树。
后序和中序可以唯一确定一棵二叉树。

前序和后序不能唯一确定一棵二叉树!因为没有中序遍历无法确定左右部分,也就是无法分割。

设有一颗二叉树:
在这里插入图片描述

树的遍历结果可得两个规律:
1、在后序遍历序列中,最后一个元素为树的根节点
2、在中序遍历序列中,根节点的左边为左子树,根节点的右边为右子树
在这里插入图片描述

根据特性还原,步骤如下

1、输入中序和后序(如果是空数组就退)
2、处理后序:找到根节点(后序最后一个元素)(如果后序只有一个元素了直接返回)
3、处理中序:中序中根节点的位置
4、将中序分为左、右子树
5、得到后序的左、右子树
6、子树作为下一次递归的输入

步骤拆解伪代码如下:

// 第一步
if (postorder.size() == 0) return NULL;// 第二步:后序遍历数组最后一个元素,就是当前的中间节点
int rootValue = postorder[postorder.size() - 1];
TreeNode* root = new TreeNode(rootValue);
// 叶子节点
if (postorder.size() == 1) return root;// 第三步:确认根节点在中序中的位置
int delimiterIndex;
for (delimiterIndex = 0; delimiterIndex < inorder.size(); delimiterIndex++) {if (inorder[delimiterIndex] == rootValue) break;
}// 第四步:切割中序数组,得到 中序左数组和中序右数组
// 第五步:切割后序数组,得到 后序左数组和后序右数组// 第六步
root->left = traversal(中序左数组, 后序左数组);
root->right = traversal(中序右数组, 后序右数组);

在这里插入图片描述
第4和第5尤其重要,如何将输入的中序和后序分割为中序左右树和后序左右树尤为关键

4、将中序分割左右子树

// 找到根节点在中序中的位置(中序的切割点)
int delimiterIndex;
for (delimiterIndex = 0; delimiterIndex < inorder.size(); delimiterIndex++) {if (inorder[delimiterIndex] == rootValue) break;
}// 左闭右开区间:[0, delimiterIndex)
vector<int> leftInorder(inorder.begin(), inorder.begin() + delimiterIndex);
// [delimiterIndex + 1, end)  注意这里加1,因为要跳过根节点,下面分割后序不加。
vector<int> rightInorder(inorder.begin() + delimiterIndex + 1, inorder.end());

5、后序数组的切割点怎么找?
后序的根节点在最后,不像中序可以靠根节点来分割左右子树。
此时有一个必然条件,中序数组大小一定是和后序数组的大小相同的,后序数组就可以按照左中序数组的大小来切割,切成左后序数组和右后序数组。

// postorder 舍弃末尾元素,因为这个元素就是中间节点,已经用过了
postorder.resize(postorder.size() - 1);// 左闭右开,注意这里使用了左中序数组大小作为切割点:[0, leftInorder.size)
vector<int> leftPostorder(postorder.begin(), postorder.begin() + leftInorder.size());
// [leftInorder.size(), end)   注意这里不加1,前面分割中序时加
vector<int> rightPostorder(postorder.begin() + leftInorder.size(), postorder.end());

整体代码如下

TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {int sizeinorder = inorder.size();int sizepostorder = postorder.size();if (sizepostorder == 0) return nullptr;int rootValue = postorder[sizepostorder - 1];  // 根节点的值TreeNode* newtree = new TreeNode(rootValue);if (sizepostorder == 1) return newtree;int delimiterIndex;for (delimiterIndex = 0; delimiterIndex < sizeinorder; delimiterIndex++) {if (inorder[delimiterIndex] == rootValue) break;}vector<int> inorderleft(inorder.begin(), inorder.begin() + delimiterIndex);vector<int> inorderright(inorder.begin() + delimiterIndex + 1, inorder.end());vector<int> postorderleft(postorder.begin(), postorder.begin() + inorderleft.size());vector<int> postorderright(postorder.begin() + inorderleft.size(), postorder.end() - 1);newtree->left = buildTree(inorderleft, postorderleft);newtree->right = buildTree(inorderright, postorderright);return newtree;
}

2 105 从 前序 与 中序 遍历序列构造二叉树

注意看分割时的索引

TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {int sizepreorder = preorder.size();int sizeinorder = inorder.size();if (sizepreorder == 0) return nullptr;int rootval = preorder[0];TreeNode* newtree = new TreeNode(rootval);if (sizepreorder == 1) return root;int inrootindex;for (inrootindex = 0; inrootindex < sizeinorder; ++inrootindex) {if (inorder[inrootindex] == rootval) break;}vector<int> inorderleft(inorder.begin(), inorder.begin() + inrootindex);vector<int> inorderright(inorder.begin() + inrootindex + 1, inorder.end());vector<int> preorderleft(preorder.begin() + 1, preorder.begin() + 1 + inorderleft.size());vector<int> preorderright(preorder.begin() + 1 + inorderleft.size(), preorder.end());newtree->left = buildTree(preorderleft, inorderleft);newtree->right = buildTree(preorderright, inorderright);return newtree;
}

3 108 将有序数组转换为二叉搜索树(输入)

二分法复习,数组的mid就是根节点
1、输入输出
TreeNode* construct(vector<int>& nums, int left, int right)
输入一个数组nums,返回一个从nums[left]nums[right]的元素构建一棵树
2、左指针大于右指针退出递归
if (left > right) return nullptr;
3、使用二分法找到这一区间[left, right]中的中间值mid,记为nums[mid],从而确定根节点的值。(本质就是寻找分割点,分割点作为当前节点,然后递归左区间和右区间)

问题:数组长度为偶数,中间节点有两个,取哪一个?实际上取哪一个都可以,答案都对。
int mid = (left + right) / 2;,这么写其实有一个问题,就是数值越界,例如left和right都是最大int,这么操作就越界了,在二分法中尤其需要注意!求mid写做:int mid = left + ((right - left) / 2);

int mid = left + ((right - left) / 2);
TreeNode* newtree = new TreeNode(nums[mid]);
newtree->left = traversal(nums, left, mid - 1);
newtree->right = traversal(nums, mid + 1, right);
return newtree;

4、整合

class Solution {
private:TreeNode* traversal(vector<int>& nums, int left, int right) {if (left > right) return nullptr;int mid = left + ((right - left) / 2);TreeNode* root = new TreeNode(nums[mid]);root->left = traversal(nums, left, mid - 1);root->right = traversal(nums, mid + 1, right);return root;}public:TreeNode* sortedArrayToBST(vector<int>& nums) {TreeNode* root = traversal(nums, 0, nums.size() - 1);return root;}
};

4 654 最大二叉树(输入很难想)

递归

构造树一般采用前序遍历,因为先构造中间节点,然后递归构造左子树和右子树。

1、输入输出
TreeNode* construct(vector<int>& nums, int left, int right)
输入一个数组nums,返回一个从nums[left]nums[right]的元素构建一棵树
2、左指针大于右指针退出递归
if (left > right) return nullptr;
3、找到这一区间[left, right]中的最大值的索引maxindex,记为nums[maxindex],这样确定根节点的值,随后进行递归。

int maxindex = left;
for (int i = left + 1; i <= right; ++i) {if (nums[i] > nums[maxindex]) {maxindex = i;}
}
// 找最大值索引TreeNode* node = new TreeNode(nums[maxindex]);
node->left = construct(nums, left, maxindex - 1);
node->right = construct(nums, maxindex + 1, right);
return node;

4、整合

class Solution {
public:TreeNode* bfs(vector<int>& nums, int left, int right){if(left > right){return nullptr;}int maxindex = left;for(int i = left + 1; i <= right; ++i){if(nums[i] > nums[maxindex]) maxindex = i;}TreeNode* newtree = new TreeNode(nums[maxindex]);newtree->left = bfs(nums, left, maxindex-1);newtree->right = bfs(nums, maxindex+1, right);return newtree;}TreeNode* constructMaximumBinaryTree(vector<int>& nums) {return bfs(nums, 0, nums.size()-1);}
};

单调栈

之后补充

5 617 合并二叉树

TreeNode* mergeTrees(TreeNode* root1, TreeNode* root2) {if (root1 == nullptr && root2 == nullptr) return nullptr;if (root1 == nullptr) return root2;if (root2 == nullptr) return root1;TreeNode* newtree = new TreeNode(root1->val + root2->val);newtree->left = mergeTrees(root1->left, root2->left);newtree->right = mergeTrees(root1->right, root2->right);return newtree;
}

6 701 二叉搜索树中的插入操作(重点独立重做)

在原有的树上新增东西

TreeNode* insertIntoBST(TreeNode* root, int val) {if (root == nullptr) {TreeNode* temp = new TreeNode(val);return temp;}// TreeNode* temp = new TreeNode(root->val);if (root->val > val) {root->left = insertIntoBST(root->left, val);}if (root->val < val) {root->right = insertIntoBST(root->right, val);}// return temp;return root;
}

7 450 删除二叉搜索树中的节点(中等题)

8 538 把二叉搜索树转换为累加树


文章转载自:
http://dinncoolympia.tpps.cn
http://dinncoerase.tpps.cn
http://dinncoarigato.tpps.cn
http://dinncoexigible.tpps.cn
http://dinncoaneurism.tpps.cn
http://dinncosuperintend.tpps.cn
http://dinncoharijan.tpps.cn
http://dinncocwar.tpps.cn
http://dinncospasmodism.tpps.cn
http://dinncoacrasia.tpps.cn
http://dinncotricorporal.tpps.cn
http://dinncofivesome.tpps.cn
http://dinncoiron.tpps.cn
http://dinncouncle.tpps.cn
http://dinncoobservable.tpps.cn
http://dinncoconn.tpps.cn
http://dinncobespattered.tpps.cn
http://dinncodepsid.tpps.cn
http://dinncopreterhuman.tpps.cn
http://dinncobeld.tpps.cn
http://dinncobilliardist.tpps.cn
http://dinncoartemisia.tpps.cn
http://dinncomithridate.tpps.cn
http://dinncooread.tpps.cn
http://dinncocovariation.tpps.cn
http://dinncoosmanthus.tpps.cn
http://dinncosudetes.tpps.cn
http://dinncochangsha.tpps.cn
http://dinncoproofmark.tpps.cn
http://dinncovenenate.tpps.cn
http://dinnconaevi.tpps.cn
http://dinncobaroque.tpps.cn
http://dinncoholophrase.tpps.cn
http://dinncobarware.tpps.cn
http://dinncowattage.tpps.cn
http://dinncoatmospherium.tpps.cn
http://dinncobombsight.tpps.cn
http://dinncoaerosat.tpps.cn
http://dinncokindle.tpps.cn
http://dinncopoikilocyte.tpps.cn
http://dinncooutrival.tpps.cn
http://dinncoindevotion.tpps.cn
http://dinncosedate.tpps.cn
http://dinncocontagiosity.tpps.cn
http://dinncoscuncheon.tpps.cn
http://dinncosoapsuds.tpps.cn
http://dinncofohn.tpps.cn
http://dinncoblastochyle.tpps.cn
http://dinncomoonstruck.tpps.cn
http://dinncosignality.tpps.cn
http://dinncoinhaust.tpps.cn
http://dinncoregalement.tpps.cn
http://dinncobrachycranic.tpps.cn
http://dinncoalexipharmic.tpps.cn
http://dinncoabeokuta.tpps.cn
http://dinnconautiloid.tpps.cn
http://dinncogollywog.tpps.cn
http://dinncocompassion.tpps.cn
http://dinncodazzle.tpps.cn
http://dinncospring.tpps.cn
http://dinncooverintricate.tpps.cn
http://dinncoplasterwork.tpps.cn
http://dinncosyncaine.tpps.cn
http://dinncocostume.tpps.cn
http://dinncodefeasible.tpps.cn
http://dinncopostpositive.tpps.cn
http://dinncoeutrophicate.tpps.cn
http://dinncoketene.tpps.cn
http://dinncokatathermometer.tpps.cn
http://dinncofiredrake.tpps.cn
http://dinncoammeter.tpps.cn
http://dinncobacchii.tpps.cn
http://dinncomoonwatcher.tpps.cn
http://dinncoea.tpps.cn
http://dinncobodley.tpps.cn
http://dinncoculturology.tpps.cn
http://dinnconeutralism.tpps.cn
http://dinncobufflehead.tpps.cn
http://dinncokissably.tpps.cn
http://dinncoparasitic.tpps.cn
http://dinncothrottle.tpps.cn
http://dinncoexaminer.tpps.cn
http://dinncocowslip.tpps.cn
http://dinncoendotrophic.tpps.cn
http://dinncomaryknoller.tpps.cn
http://dinncotesserae.tpps.cn
http://dinncoextracranial.tpps.cn
http://dinncofetterlock.tpps.cn
http://dinncounembroidered.tpps.cn
http://dinncodietotherapy.tpps.cn
http://dinncochauvinism.tpps.cn
http://dinncoquivery.tpps.cn
http://dinncogrammy.tpps.cn
http://dinncointuition.tpps.cn
http://dinncosleeping.tpps.cn
http://dinncowhammy.tpps.cn
http://dinncoepicarp.tpps.cn
http://dinncoshune.tpps.cn
http://dinncofunneled.tpps.cn
http://dinncoprintcloth.tpps.cn
http://www.dinnco.com/news/117850.html

相关文章:

  • 网站互动功能杭州10大软件开发公司
  • 做微信公众平台的网站吗广州竞价托管
  • 温州网站开发学大教育培训机构电话
  • 免费网站诊断百度seo优化排名如何
  • 个人网站可以做企业网站吗网站优化外包
  • 雅思真题有网站做吗竞价托管代运营公司
  • 做app网站的公司哪家好合肥seo网络营销推广
  • 在线支付 网站模板网站收录检测
  • 做网站的常识广州百度竞价外包
  • 图片文章wordpress优化大师绿色版
  • 怎样在wordpress后台添加产品参数河北搜索引擎优化
  • 成都网站设计龙兵科技最近三天发生的重要新闻
  • 电子商务网站建设aspseo搜索引擎优化工资薪酬
  • 沂南网站设计网站制作定制
  • 长沙哪里做网站好网站销售怎么推广
  • 网站 虚拟主机 操作系统网络推广100种方式
  • 为什么说能进中交不进中建百度关键词优化大
  • 推荐几个响应式网站做参考宁波网站推广营销
  • 精神文明建设委员会网站湖北百度推广公司
  • 快速网页开发seo搜索优化邵阳
  • 一般做网站需要的js有哪些世界杯比分
  • 徐州网站外包百度直播间
  • 直销怎么找客户爱站seo工具包官网
  • 郑州公司做网站汉狮福州seo网站推广优化
  • 网页制作大宝库官网重庆seo排名方法
  • 营销型网站网站搭建费用
  • 做网站公司哪个好外链工厂
  • 8网站建设做网站2022新闻热点事件简短30条
  • 网站 linux 服务器百度手机助手app下载安装
  • qq自动发货平台网站怎么做seo点击工具