7 - 栈(1)
最近这段时间想了好多,发现未来确实想不明白,也没有什么用。只能做好当下的事情,然后提升自己的心力,活着最需要的就是勇气。让自己在未来能够承受得住打击,把握得住机会。
20. 有效的括号
题目大意:给定一个只包括 ‘(’,‘)’,‘{’,‘}’,‘[’,‘]’ 的字符串 s ,判断字符串是否有效。有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
每个右括号都有一个对应的相同类型的左括号。
解题思路:可以直接使用STL中是stack结构来完成,入栈是进行判定,如果是三种左括号总的一种则直接入栈,如果是三种有括号的一种则判定栈顶是否与之匹配,匹配则弹出;如果不匹配,则返回false。遍历完成后,若栈空则返回true,若栈不空说明有括号为匹配成功,则返回false。
代码:
bool isValid(string s) {
if(s.length() == 0)
return true;
stack<char> q;
for(auto i : s){
if((i == '(')||(i == '[')||(i == '{'))
q.push(i);
else if((i == ')')&&(q.size()>0)&&(q.top() == '(')||
(i == ']')&&(q.size()>0)&&(q.top() == '[')||
(i == '}')&&(q.size()>0)&&(q.top() == '{'))
q.pop();
else
return false;
}
if(q.empty())
return true;
return false;
}
94. 二叉树的中序遍历
题目大意:给定一个二叉树的根节点 root ,返回 它的 中序 遍历 。
解题思路:使用递归调用的方法即可。
代码:
vector<int> inorderTraversal(TreeNode* root) {
vector<int>ans;
inorder(root,ans);
return ans;
}
void inorder(TreeNode* root, vector<int>&ans){
if(!root){
return;
}
inorder(root->left,ans);
ans.push_back(root->val);
inorder(root->right,ans);
}
144. 二叉树的前序遍历
题目大意:给你二叉树的根节点 root ,返回它节点值的前序遍历。
解题思路:递归调用。
代码:
vector<int> preorderTraversal(TreeNode* root) {
vector<int>ans;
preorder(root,ans);
return ans;
}
void preorder(TreeNode* root, vector<int>&ans){
if(!root){
return;
}
ans.push_back(root->val);
preorder(root->left,ans);
preorder(root->right,ans);
}
145. 二叉树的后序遍历
题目大意:给你一棵二叉树的根节点 root ,返回其节点值的后序遍历 。
解题思路:递归调用。
代码:
vector<int> postorderTraversal(TreeNode* root) {
vector<int>ans;
postorder(root,ans);
return ans;
}
void postorder(TreeNode* root, vector<int>&ans){
if(!root){
return;
}
postorder(root->left,ans);
postorder(root->right,ans);
ans.push_back(root->val);
}