654.最大二叉树
看见题目的第一想法:
这道题看见了和使用中序和后序构造二叉树方法基本上一致,思路有了,实践开始
class Solution { public: TreeNode* traversal(vector<int> nums) { TreeNode* node = new TreeNode(0); if(nums.size() == 1) { node->val = nums[0]; return node; } int i = 0; pair value = pair(0, nums[0]); for(; i < nums.size(); i++) { if(value.second < nums[i]) { value.first = i; value.second = nums[i]; } } node->val = value.second; // 切割数组 if(value.first > 0) { vector<int> leftNums(nums.begin(), nums.begin()+value.first); node->left = traversal(leftNums); } if(nums.size() - value.first > 1) { vector<int> rightNums(nums.begin()+value.first+1, nums.end()); node->right = traversal(rightNums); } return node; } TreeNode* constructMaximumBinaryTree(vector<int>& nums) { return traversal(nums); } };
class Solution { public: TreeNode* traversal(vector<int>& nums, int left, int right) { // 简化版本,使用下标来优化内存消耗 if(left >= right) return NULL; int maxIndex = left; for(int i = left; i < right; i++) { if(nums[i] > nums[maxIndex]) maxIndex = i; } TreeNode* node = new TreeNode(nums[maxIndex]); // 左闭右开 node->left = traversal(nums, left, maxIndex); node->right = traversal(nums, maxIndex+1, right); return node; } TreeNode* constructMaximumBinaryTree(vector<int>& nums) { return traversal(nums, 0, nums.size()); } };
遇到的问题:
在分割数组的时候分割错误,还有就是在递归结束条件写的不是很好,但大体思路有了,但不够细节,慢慢努力
617.合并二叉树
题目链接;力扣
看见题目的第一想法:
这道题一看就大概有思路了,同时遍历两棵树就好,但我写的时候将所有条件都写上去了,写了很多还错了,这就很烦了,我觉得应该没那么复杂,看了题解之后就几行代码,是我想多了,按照之前递归的方式来写了
class Solution { public: TreeNode* mergeTrees(TreeNode* root1, TreeNode* root2) { if(root1 == NULL) return root2; if(root2 == NULL) return root1; root1->val += root2->val; root1->left = mergeTrees(root1->left, root2->left); root1->right = mergeTrees(root1->right, root2->right); return root1; } };
class Solution { public: TreeNode* mergeTrees(TreeNode* root1, TreeNode* root2) { // 迭代法(前序遍历) if(root1 == NULL) return root2; if(root2 == NULL) return root1; queue<TreeNode*> que; que.push(root1); que.push(root2); while(!que.empty()) { TreeNode* r1 = que.front(); que.pop(); TreeNode* r2 = que.front(); que.pop(); r1->val += r2->val; if(r1->right != NULL && r2->right != NULL) { que.push(r1->right); que.push(r2->right); } if(r1->left != NULL && r2->left != NULL) { que.push(r1->left); que.push(r2->left); } if(r1->left == NULL && r2->left != NULL) { r1->left = r2->left; } if(r1->right == NULL && r2->right != NULL) { r1->right = r2->right; } } return root1; } };
遇到的问题:
在实现上出现了问题,没有想的那么周全,还写复杂了很多
700.二叉搜索树中的搜索
题目链接:力扣
看见题目的第一想法:
第一眼看到二叉搜索树有点忘了是什么树了,看了一眼左节点比根节点小,右结点比根节点大就是二叉搜索树,这下就有思路了
class Solution { public: TreeNode* searchBST(TreeNode* root, int val) { if(root == NULL) return NULL; if(root->val < val) { root = searchBST(root->right, val); } else if(root->val > val) { root = searchBST(root->left, val); } return root; } };
遇到的问题:没有太大的问题
98.验证二叉搜索树
题目链接;力扣
看见题目的第一想法:
有了上一题的经验,这题也很容易就解决了
class Solution { public: TreeNode* searchBST(TreeNode* root, int val) { if(root == NULL) return NULL; if(root->val < val) { root = searchBST(root->right, val); } else if(root->val > val) { root = searchBST(root->left, val); } return root; } };
遇到的问题:
没有太大的问题