DAY17 - 654.最大二叉树,617.合并二叉树,700.二叉搜索树中的搜索,98.验证二叉搜索树
654.最大二叉树
和之前中序后序构造二叉树的题目类似,其实更简单(因为只有一个数组)。
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
TreeNode* traversal(vector<int>& nums, int begin, int end){
if(begin>=end) return nullptr;
int max=-1;
int maxindex=0;
for(int i=begin;i<end;i++){
if(nums[i]>max){
max=nums[i];
maxindex=i;
}
}
TreeNode* node=new TreeNode(max);
node->left=traversal(nums,begin,maxindex);
node->right=traversal(nums,maxindex+1,end);
return node;
}
TreeNode* constructMaximumBinaryTree(vector<int>& nums) {
if(nums.size()==0) return nullptr;
return traversal(nums,0,nums.size());
}
};
617.合并二叉树
给你两棵二叉树:
root1和root2。想象一下,当你将其中一棵覆盖到另一棵之上时,两棵树上的一些节点将会重叠(而另一些不会)。你需要将这两棵树合并成一棵新二叉树。合并的规则是:如果两个节点重叠,那么将这两个节点的值相加作为合并后节点的新值;否则,不为 null 的节点将直接作为新二叉树的节点。
返回合并后的二叉树。
注意: 合并过程必须从两个树的根节点开始。
class Solution {
public:
TreeNode* mergeTrees(TreeNode* root1, TreeNode* root2) {
if(!root1) return root2;
if(!root2) return root1;
TreeNode* node=new TreeNode(root1->val+root2->val);
node->left=mergeTrees(root1->left,root2->left);
node->right=mergeTrees(root1->right,root2->right);
return node;
}
};
easy。不过这样来同时遍历两个二叉树还是比较有趣的
700.二叉搜索树中的搜索
之前学BST的时候就是一开始觉得很简单,后面某一时刻走了下神再回来听就听不懂了。
给定二叉搜索树(BST)的根节点
root和一个整数值val。你需要在 BST 中找到节点值等于
val的节点。 返回以该节点为根的子树。 如果节点不存在,则返回null。
class Solution {
public:
TreeNode* searchBST(TreeNode* root, int val) {
if(root==nullptr) return nullptr;
int curval=root->val;
if(curval==val) return root;
if(val>curval) return searchBST(root->right,val);
if(val<curval) return searchBST(root->left,val);
return nullptr;
}
};
标答的写法更简单
class Solution {
public:
TreeNode* searchBST(TreeNode* root, int val) {
if (root == NULL || root->val == val) return root;
if (root->val > val) return searchBST(root->left, val);
if (root->val < val) return searchBST(root->right, val);
return NULL;
}
};
98.验证二叉搜索树
不能单纯地判断左结点val小于中间右节点val大于中间。
BST要中序遍历才是有序的,因为是左中右的顺序。
所以最简单的思路就是中序遍历把所有val都存到一个数组里面,判断数组是否是单调递增。这样就有额外空间消耗。
可以在递归过程中判断,因为说白了就是比较每一个结点val都要比前一个结点val大。
class Solution {
public:
TreeNode* pre=nullptr;
bool isValidBST(TreeNode* root) {
if(root==nullptr) return true;
bool left=isValidBST(root->left);
if(pre!=nullptr&&pre->val>=root->val) return false;
pre=root;
bool right=isValidBST(root->right);
return left&&right;
}
};
浙公网安备 33010602011771号