@ 代码随想录算法训练营第四周(C语言)|Day20(二叉树)
Day20、二叉树(包含题目 654.最大二叉树 617.合并二叉树 700.二叉搜索树中的搜索 98.验证二叉搜索树 )
654.最大二叉树
题目描述
给定一个不含重复元素的整数数组。一个以此数组构建的最大二叉树定义如下:
二叉树的根是数组中的最大元素。
左子树是通过数组中最大值左边部分构造出的最大二叉树。
右子树是通过数组中最大值右边部分构造出的最大二叉树。
题目解答
struct TreeNode* constructMaximumBinaryTree(int* nums, int numsSize) {
if(numsSize==0){
return NULL;
}
struct TreeNode*root=(struct TreeNode*)malloc(sizeof(struct TreeNode));
root->left=NULL;
root->right=NULL;
int index;
int maxnum=0;
for(int i=0;i<numsSize;i++){
if(maxnum<nums[i]){
index=i;
maxnum=nums[i];
}
}
root->val=maxnum;
if(numsSize==1){
return root;
}
root->left=constructMaximumBinaryTree(nums,index);
root->right=constructMaximumBinaryTree(nums+index+1,numsSize-index-1);
return root;
}
题目总结
创造数组更简单一点的。
617.合并二叉树
题目描述
给定两个二叉树,想象当你将它们中的一个覆盖到另一个上时,两个二叉树的一些节点便会重叠。
题目解答
struct TreeNode* mergeTrees(struct TreeNode* root1, struct 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;
}
题目总结
两个树的合并。
700.二叉搜索树中的搜索
题目描述
给定二叉搜索树(BST)的根节点和一个值。 你需要在BST中找到节点值等于给定值的节点。 返回以该节点为根的子树。 如果节点不存在,则返回 NULL。
题目解答
struct TreeNode* searchBST(struct TreeNode* root, int val) {
if(root==NULL){
return NULL;
}
if(root->val==val){
return root;
}
struct TreeNode*res=NULL;
if(root->val<val){
res=searchBST(root->right,val);
}else{
res=searchBST(root->left,val);
}
return res;
}
题目总结
简单。
98.验证二叉搜索树
题目描述
给定一个二叉树,判断其是否是一个有效的二叉搜索树。
假设一个二叉搜索树具有如下特征:
节点的左子树只包含小于当前节点的数。
节点的右子树只包含大于当前节点的数。
所有左子树和右子树自身必须也是二叉搜索树。
题目解答
int maxnum=-1111;
bool isValidBST(struct TreeNode* root) {
if(root==NULL){
return true;
}
bool left=isValidBST(root->left);
if(root->val>maxnum){
maxnum=root->val;
}else{
return false;
}
bool right=isValidBST(root->right);
return left&&right;
}
题目总结
不能单纯的比较左节点小于中间节点。