1、654最大二叉树
我的思路:和从前序、中序、后序重构二叉树的框架一样。应该重构二叉树都是一个框架。
代码随想录
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| class Solution { public: TreeNode* traverse(vector<int>& nums, int start, int end){ if(start > end){ return nullptr; }
int maxval = nums[start]; int idx = start; for(int i = start+1;i<=end;i++){ if(nums[i] > maxval){ maxval = nums[i]; idx = i; } }
auto root = new TreeNode(maxval);
root->left = traverse(nums,start,idx-1); root->right = traverse(nums,idx+1,end); return root; } TreeNode* constructMaximumBinaryTree(vector<int>& nums) { return traverse(nums,0,nums.size()-1); } };
|
2、617合并二叉树

我的思路: 这道题还是递归的去构造二叉树就行,由于是两棵树所以参数是两个树节点。
代码随想录: 看了代码随想录之后发现我写的还是太冗余了。对于没有节点的位置我在树上虚拟了一个空节点。其实对于一个子树上没有节点的,直接把另一个树的子树接过来就ok。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
| class Solution { public: TreeNode* mergeTrees(TreeNode* root1, TreeNode* root2) { if(root1 == nullptr && root2 == nullptr)return nullptr; TreeNode* root = nullptr; if(root1 != nullptr){ if(root2!=nullptr){ root1->val +=root2->val; root = root1; } }else{ root = root2; } root->left = mergeTrees(root1 == nullptr?nullptr:root1->left, root2 == nullptr?nullptr:root2->left); root->right = mergeTrees(root1 == nullptr?nullptr:root1->right, root2 == nullptr?nullptr:root2->right); return root; } };
class Solution { public: TreeNode* mergeTrees(TreeNode* root1, TreeNode* root2) { if(root1 == nullptr )return root2; if(root2 == nullptr )return root1; root1->val +=root2->val; root1->left = mergeTrees(root1->left,root2->left); root1->right = mergeTrees(root1->right,root2->right); return root1; } };
|
3、700二叉搜索树中的搜索
给定二叉搜索树(BST)的根节点 root 和一个整数值 val。你需要在 BST 中找到节点值等于 val 的节点。 返回以该节点为根的子树。 如果节点不存在,则返回 null 。
二叉搜索树:也称二叉排序树或二叉查找树。
非空左子树的所有键值小于其根结点的键值。
非空右子树的所有键值大于其根结点的键值。
左、右子树都是二叉搜索树。

我的思路: 利用二叉搜索树的性质就行。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| class Solution { public: TreeNode* searchBST(TreeNode* root, int val) { if(root == nullptr || val == root->val)return root;
if(val < root->val){ return searchBST(root->left,val); } if(val > root->val){ return searchBST(root->right,val); } return nullptr; } };
|
4、98验证二叉搜索树
给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。
遇到二叉搜索树,一定想着中序遍历,这样才能利用上特性。二叉搜索树中不能有重复元素。
我的思路:没做出来。
代码随想录: 代码随想录也是利用这个性质。先中序遍历,再检查遍历结果是否单调。我的和它的区别是我没有保存全部遍历结果,我只保留最后一个元素,节省内存。
二叉搜索树中序遍历特性: 中序遍历下,输出的二叉搜索树节点的数值是有序序列。验证二叉搜索树,就相当于变成了判断一个序列是不是递增的了。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
| class Solution { public: bool traverse(TreeNode* root, TreeNode* &lastnode){ if(root == nullptr) return true;
if(traverse(root->left,lastnode) == false)return false; if(lastnode != nullptr && root->val <= lastnode->val){ return false; } lastnode = root; if(traverse(root->right,lastnode) == false)return false; return true; } bool isValidBST(TreeNode* root) { TreeNode* lastnode = nullptr; return traverse(root,lastnode); } };
class Solution { private: vector<int> vec; void traversal(TreeNode* root) { if (root == NULL) return; traversal(root->left); vec.push_back(root->val); traversal(root->right); } public: bool isValidBST(TreeNode* root) { vec.clear(); traversal(root); for (int i = 1; i < vec.size(); i++) { if (vec[i] <= vec[i - 1]) return false; } return true; } };
|
代码随想录算法训练第十七天|654最大二叉树|617合并二叉树|700二叉搜索树中的搜索|98验证二叉搜索树