遵义本地网,网站改版seo方案,网站开发经验教训,wordpress管理插件下载654.最大二叉树
题目
给定一个不含重复元素的整数数组。一个以此数组构建的最大二叉树定义如下#xff1a;
二叉树的根是数组中的最大元素。左子树是通过数组中最大值左边部分构造出的最大二叉树。右子树是通过数组中最大值右边部分构造出的最大二叉树。
通过给定的数组构…654.最大二叉树
题目
给定一个不含重复元素的整数数组。一个以此数组构建的最大二叉树定义如下
二叉树的根是数组中的最大元素。左子树是通过数组中最大值左边部分构造出的最大二叉树。右子树是通过数组中最大值右边部分构造出的最大二叉树。
通过给定的数组构建最大二叉树并且输出这个树的根节点。
示例 思考
本题也是通过递归的方式构造二叉树找到数组中最大的数然后最大数左部分变成一个数组右部分变成一个数组继续node-left、node-right递归两个数组注意创建左右数组的时候需要跳过node
代码
class Solution {
public: TreeNode* traversal(vectorint nums) { if(nums.size() 0) return nullptr; int maxValue INT_MIN; for(auto i : nums) { maxValue max(maxValue, i); } TreeNode* node new TreeNode(maxValue); int pos 0; for(; pos nums.size(); pos) { if(nums[pos] maxValue) break; } vectorint left(nums.begin(), nums.begin() pos); vectorint right(nums.begin() pos 1, nums.end()); node-left traversal(left); node-right traversal(right); return node; } TreeNode* constructMaximumBinaryTree(vectorint nums) { return traversal(nums); }
};
617.合并二叉树
题目
给定两个二叉树想象当你将它们中的一个覆盖到另一个上时两个二叉树的一些节点便会重叠。
你需要将他们合并为一个新的二叉树。合并的规则是如果两个节点重叠那么将他们的值相加作为节点合并后的新值否则不为 NULL 的节点将直接作为新二叉树的节点。
示例 1: 注意: 合并必须从两个树的根节点开始。
思考
想了很久怎么用层序遍历做卡在了如果tree1和tree2的层数不一样该怎么遍历看了解题答案发现其实就是把tree1和tree2的两个结点都存入que即可同时并不需要计算size因为可以用tree1来代替new TreeNode这里需要判断四个情况node1-left ! nullptr node2-left ! nullptr、node1-right ! nullptr node2-right ! nullptr、node1-left nullptr node2-left ! nullptr、node1-right nullptr node2-right ! nullptr。
代码
class Solution {
public: TreeNode* mergeTrees(TreeNode* root1, TreeNode* root2) { if(root1 nullptr) return root2; if(root2 nullptr) return root1; queueTreeNode* que; que.push(root1); que.push(root2); while(!que.empty()) { TreeNode* node1 que.front(); que.pop(); TreeNode* node2 que.front(); que.pop(); node1-val node2-val; if(node1-left ! nullptr node2-left ! nullptr) { que.push(node1-left); que.push(node2-left); } if(node1-right ! nullptr node2-right ! nullptr) { que.push(node1-right); que.push(node2-right); } if(node1-left nullptr node2-left ! nullptr) node1-left node2-left; if(node1-right nullptr node2-right ! nullptr) node1-right node2-right; } return root1; }
};
700.二叉搜索树中的搜索
题目
给定二叉搜索树BST的根节点和一个值。 你需要在BST中找到节点值等于给定值的节点。 返回以该节点为根的子树。 如果节点不存在则返回 NULL。
例如 在上述示例中如果要找的值是 5但因为没有节点值为 5我们应该返回 NULL。
思考
开始二叉搜索树啦其实二叉搜索树定义很简单一个结点的左子树所有结点都比它小右子树的所有结点都比它大本题其实就是找到一个二叉搜索树的子树如果这个结点大于给定val那么root root-right如果小于那么root root-left如果等于就return root; 注意这里要用while(root ! null)来做循环持续判断root
代码
class Solution {
public: TreeNode* searchBST(TreeNode* root, int val) { while(root ! NULL) { if(root-val val) root root-left; else if(root-val val) root root- right; else return root; } return NULL; }
};
98.验证二叉搜索树
题目
给定一个二叉树判断其是否是一个有效的二叉搜索树。
假设一个二叉搜索树具有如下特征
节点的左子树只包含小于当前节点的数。节点的右子树只包含大于当前节点的数。所有左子树和右子树自身必须也是二叉搜索树。 思考
这题陷入了一个常见的误区就是没有判断该结点左右子树的所有元素都小于或大于该结点而仅仅判断了该结点的左右结点看了卡哥的视频才发现二叉搜索树需要用中序遍历来写
1、用中序遍历来将二叉树变成一个数组然后判断这个数组是不是递增排布的
2、创建一个值为最小值的maxValue用中序遍历来将每一个结点都与maxValue进行判断如果大于它那么mavValue的值就被该结点的值取代如果小于就return false因为二叉搜索树左中右是递增关系
代码
class Solution {
public: long long maxValue LONG_MIN; bool isValidBST(TreeNode* root) { if(root nullptr) return true; bool left isValidBST(root-left); if(root-val maxValue) maxValue root-val; else return false; bool right isValidBST(root-right); return left right; }
};