题一:二叉树的所有路径
给你一个二叉树的根节点 root ,按 任意顺序 ,返回所有从根节点到叶子节点的路径。
叶子节点 是指没有子节点的节点。
示例 1:
输入:root = [1,2,3,null,5]
输出:[“1->2->5”,“1->3”]
示例 2:
输入:root = [1]
输出:[“1”]
提示:
树中节点的数目在范围 [1, 100] 内
-100 <= Node.val <= 100
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/binary-tree-paths
/**
* 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:
void binary(TreeNode* root,vector<string> &nums,string str){
if(root==nullptr) return;
str+=to_string(root->val); //将数值转换为字符型,string类型可以通过+来拼接
if(root->left==nullptr&&root->right==nullptr){ //满足此条件时,说明此结点为此条路径末尾
nums.push_back(str);
str="";
}
if(root->left!=nullptr||root->right!=nullptr){
str+="->";
binary(root->left,nums,str);
binary(root->right,nums,str);
}
}
vector<string> binaryTreePaths(TreeNode* root) {
vector<string> nums;
//深度优先遍历
binary(root,nums,"");
return nums;
}
};
题二:最小栈
设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。
push(x) —— 将元素 x 推入栈中。
pop() —— 删除栈顶的元素。
top() —— 获取栈顶元素。
getMin() —— 检索栈中的最小元素。
示例:
输入:
[“MinStack”,“push”,“push”,“push”,“getMin”,“pop”,“top”,“getMin”]
[[],[-2],[0],[-3],[],[],[],[]]
输出:
[null,null,null,null,-3,null,0,-2]
解释:
MinStack minStack = new MinStack();
minStack.push(-2);
minStack.push(0);
minStack.push(-3);
minStack.getMin(); --> 返回 -3.
minStack.pop();
minStack.top(); --> 返回 0.
minStack.getMin(); --> 返回 -2.
提示:
pop、top 和 getMin 操作总是在 非空栈 上调用。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/min-stack
class MinStack {
stack<int> str;
stack<int> minStr; //这个栈用于存放最小值
public:
MinStack() {
minStr.push(INT_MAX);
}
void push(int val) {
str.push(val);
minStr.push(min(minStr.top(),val)); //将最小的元素存入
}
void pop() {
str.pop();
minStr.pop();
}
int top() {
return str.top();
}
int getMin() {
return minStr.top();
}
};
/**
* Your MinStack object will be instantiated and called as such:
* MinStack* obj = new MinStack();
* obj->push(val);
* obj->pop();
* int param_3 = obj->top();
* int param_4 = obj->getMin();
*/
题三:二进制求和
给你两个二进制字符串,返回它们的和(用二进制表示)。
输入为 非空 字符串且只包含数字 1 和 0。
示例 1:
输入: a = “11”, b = “1”
输出: “100”
示例 2:
输入: a = “1010”, b = “1011”
输出: “10101”
提示:
每个字符串仅由字符 ‘0’ 或 ‘1’ 组成。
1 <= a.length, b.length <= 10^4
字符串如果不是 “0” ,就都不含前导零。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/add-binary
class Solution {
public:
string addBinary(string a, string b) {
reverse(a.begin(),a.end());
reverse(b.begin(),b.end()); //将a,b翻转过来
int len1=a.length();
int len2=b.length();
string str;
int i=0,j=0;
int index=0; //表示有无进位
int temp1;
int temp2;
while(i<len1||j<len2){
if(i<len1){
temp1=a[i]-'0';
i++;
}
else{
temp1=0;
}
if(j<len2){
temp2=b[j]-'0';
j++;
}
else{
temp2=0;
}
int temp=temp1+temp2+index;
if(temp>1){
index=1;
temp=temp%2;
}
else
index=0;
str+=to_string(temp);
}
if(index>0)
str+=to_string(index);
reverse(str.begin(),str.end());
return str;
}
};