leetcode树
104. 二叉树的最大深度
- 二叉树的最大深度
给定一个二叉树,找出其最大深度。
二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。
说明: 叶子节点是指没有子节点的节点。
示例: 给定二叉树 [3,9,20,null,null,15,7],
3
/ 9 20 / 15 7 返回它的最大深度 3 。
class Solution {
public:
int maxDepth(TreeNode* root) {
if(root==NULL){
return 0;
}else{
return max(maxDepth(root->left),maxDepth(root->right))+1;
}
}
};
110. 平衡二叉树
- 平衡二叉树
给定一个二叉树,判断它是否是高度平衡的二叉树。
本题中,一棵高度平衡二叉树定义为:
一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 。
class Solution {
public:
bool result =true;
bool isBalanced(TreeNode* root) {
maxDepth(root);
return result;
}
int maxDepth(TreeNode* root) {
if(root==NULL){
return 0;
}else{
int l=maxDepth(root->left) ;
int r=maxDepth(root->right);
if (abs(l - r) > 1) result = false;
return 1 + max(l, r);
}
}
};
543. 二叉树的直径
- 二叉树的直径
给定一棵二叉树,你需要计算它的直径长度。一棵二叉树的直径长度是任意两个结点路径长度中的最大值。这条路径可能穿过也可能不穿过根结点。
示例 : 给定二叉树
1
/ \
2 3
/ \
4 5
返回 3, 它的长度是路径 [4,2,1,3] 或者 [5,2,1,3]。
class Solution {
public:
int m = 0;
int diameterOfBinaryTree(TreeNode* root) {
depth(root);
return m;
}
int depth(TreeNode* root) {
if (root == NULL) return 0;
int leftDepth = depth(root->left);
int rightDepth = depth(root->right);
m = max(m, leftDepth + rightDepth);
return max(leftDepth, rightDepth) + 1;
}
};
226. 翻转二叉树
- 翻转二叉树
翻转一棵二叉树。
示例:
输入:
4
/ \
2 7
/ \ / \
1 3 6 9
输出:
4
/ \
7 2
/ \ / \
9 6 3 1
class Solution {
public:
TreeNode* invertTree(TreeNode* root) {
TreeNode *tmp;
if(root==NULL){
return NULL;
}else{
tmp=invertTree(root->left);
root->left=invertTree(root->right);
root->right=tmp;
return root;
}
}
};
226. 翻转二叉树
- 合并二叉树
给定两个二叉树,想象当你将它们中的一个覆盖到另一个上时,两个二叉树的一些节点便会重叠。
你需要将他们合并为一个新的二叉树。合并的规则是如果两个节点重叠,那么将他们的值相加作为节点合并后的新值,否则不为 NULL 的节点将直接作为新二叉树的节点。
注意: 合并必须从两个树的根节点开始。
class Solution {
public:
TreeNode* mergeTrees(TreeNode* t1, TreeNode* t2) {
if (t1 == NULL && t2 == NULL) return NULL;
if (t1 == NULL) return t2;
if (t2 == NULL) return t1;
TreeNode* root = new TreeNode(t1->val + t2->val);
root->left = mergeTrees(t1->left, t2->left);
root->right = mergeTrees(t1->right, t2->right);
return root;
}
};
112. 路径总和
- 路径总和
给你二叉树的根节点 root 和一个表示目标和的整数 targetSum ,判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和 targetSum 。
叶子节点 是指没有子节点的节点。
class Solution {
public:
bool hasPathSum(TreeNode* root, int targetSum) {
if(root==NULL){
return false;
}
if (root->left == NULL && root->right == NULL && root->val == targetSum)
return true;
return hasPathSum(root->left, targetSum - root->val) || hasPathSum(root->right, targetSum - root->val);
}
};
437. 路径总和 III
- 路径总和 III
给定一个二叉树的根节点 root ,和一个整数 targetSum ,求该二叉树里节点值之和等于 targetSum 的 路径 的数目。
路径 不需要从根节点开始,也不需要在叶子节点结束,但是路径方向必须是向下的(只能从父节点到子节点)。
class Solution {
public:
int pathSum(TreeNode* root, int targetSum) {
if(root==NULL) return 0;
int ret =pathSumStartWithRoot(root, targetSum) + pathSum(root->left, targetSum) + pathSum(root->right, targetSum);
return ret;
}
int pathSumStartWithRoot(TreeNode* root, int sum) {
if (root == NULL) return 0;
int ret = 0;
if (root->val == sum) ret++;
ret += pathSumStartWithRoot(root->left, sum - root->val) + pathSumStartWithRoot(root->right, sum - root->val);
return ret;
}
};
572. 另一棵树的子树
- 另一棵树的子树
给你两棵二叉树 root 和 subRoot 。检验 root 中是否包含和 subRoot 具有相同结构和节点值的子树。如果存在,返回 true ;否则,返回 false 。
二叉树 tree 的一棵子树包括 tree 的某个节点和这个节点的所有后代节点。tree 也可以看做它自身的一棵子树。
class Solution {
public:
bool isSubtree(TreeNode* root, TreeNode* subRoot) {
if(root==NULL)return false;
return isSubtreeWithRoot(root, subRoot) || isSubtree(root->left, subRoot) || isSubtree(root->right, subRoot);
}
bool isSubtreeWithRoot(TreeNode* root, TreeNode* subRoot){
if (root == NULL && subRoot == NULL) return true;
if (root == NULL || subRoot == NULL) return false;
if (root->val != subRoot->val) return false;
return isSubtreeWithRoot(root->left, subRoot->left) && isSubtreeWithRoot(root->right, subRoot->right);
}
};
牛客网试题1.化冰
#include <iostream>
using namespace std;
int main(){
int c[5];
for(int i=0;i<5;i++)
cin>>c[i];
int time=0;
if(c[0]<c[1]){
if(c[0]<0&&c[1]<0){
time=(c[1]-c[0])*c[2];
}else if(c[0]>0&&c[1]>0){
time=(c[1]-c[0])*c[4];
}else if(c[0]<0&&c[1]>0){
time=(0-c[0])*c[2]+c[3]+c[1]*c[4];
}else if(c[0]==0&&c[1]==0){
time=c[3];
}
}
cout<<time;
return 0;
}
|