普通版 剑指 Offer 浅刷浅刷( 七 )


方法二:栈,先存入根节点,然后弹出栈顶元素,交换其左右节点,再存入弹出的该节点的左右子树,一直循环,知道栈空为止 。
方法三:队列,与上述的栈思路相同 。
剑指 Offer 28. 对称的二叉树
/*** Definition for a binary tree node.* struct TreeNode {*int val;*TreeNode *left;*TreeNode *right;*TreeNode(int x) : val(x), left(NULL), right(NULL) {}* };*/class Solution {public:bool isSymmetric(TreeNode* root) {if (!root) {return 1;}return helpJudge(root->left, root->right);}bool helpJudge(TreeNode *leftNode, TreeNode *rightNode) {if (!leftNode && !rightNode) {return 1;}if (!leftNode || !rightNode) {return 0;}return leftNode->val == rightNode->val && helpJudge(leftNode->left, rightNode->right) && helpJudge(leftNode->right, rightNode->left);}};
思路就看这个大哥的吧,我觉得他很牛皮 。
剑指 Offer 29. 顺时针打印矩阵
class Solution {public:vector spiralOrder(vector>& matrix) {vector myVector;if (matrix.empty()) {return myVector;}int col = matrix[0].size() - 1, row = matrix.size() - 1; //最大行数 列数int tempCol = 0, tempRow = 0; //初始行数 列数while (1) {for (int i = tempCol; i <= col; i++) { //从左到右myVector.push_back(matrix[tempRow][i]);}if (++tempRow > row) {break;}for (int i = tempRow; i <= row; i++) { //从上到下myVector.push_back(matrix[i][col]);}if (--col < tempCol) {break;}for (int i = col; i >= tempCol; i--) { //从右到左myVector.push_back(matrix[row][i]);}if (--row < tempRow) {break;}for (int i = row; i >= tempRow; i--) { //从下到上myVector.push_back(matrix[i][tempCol]);}if (++tempCol > col) {break;}}return myVector;}};
打印螺旋矩阵,感觉没啥说的 。
剑指 Offer 30. 包含min函数的栈
class MinStack {public:/** initialize your data structure here. */stack myStack;stack minStack;MinStack() {}void push(int x) {myStack.push(x);if (minStack.empty()) {minStack.push(x);}if (myStack.top() < minStack.top()) {minStack.push(x);} else if (myStack.size() != minStack.size()) {minStack.push(minStack.top());}}void pop() {if (!myStack.empty()) {myStack.pop();minStack.pop();}}int top() {return myStack.top();}int min() {return minStack.top();}};/*** Your MinStack object will be instantiated and called as such:* MinStack* obj = new MinStack();* obj->push(x);* obj->pop();* int param_3 = obj->top();* int param_4 = obj->min();*/
使用两个栈,一个作为普通栈()另一个作为存储最小数的栈(),这两个栈的size相同,同时push、同时pop,每次向普通栈()中push数据的时候都与最小栈()的顶层元素进行比较,若比其小则向最小栈()中push该元素,否则最小栈()就将之前顶层数据再进行拷贝一遍push到自己的顶层,这样最小栈()的顶层元素一直都会是普通栈()的最小值了 。
剑指 Offer 31. 栈的压入、弹出序列
class Solution {public:bool validateStackSequences(vector& pushed, vector& popped) {if (pushed.empty()) {return 1;}stack myStack; //用于顺序的将pushed中的数据存储到栈中,便于比较for (int i = 0; i < pushed.size(); i++) {myStack.push(pushed[i]);while (!myStack.empty() && !popped.empty() && myStack.top() == popped[0]) { //相等就将其删除popped.erase(popped.begin()); //删除popped第一个元素myStack.pop(); //弹出栈顶元素}if (popped.empty()) {return 1;}}return 0;}};//或者 升级版 直接在原序列进行操作class Solution {public:bool validateStackSequences(vector& pushed, vector& popped) {if (pushed.empty()) {return 1;}int i = 0;while (i < pushed.size()) {while (!popped.empty() && pushed[i] == popped[0]) { //相等就将其删除popped.erase(popped.begin()); //删除popped第一个元素pushed.erase(pushed.begin() + i); //删除该元素if (i > 0) {i--;}}if (popped.empty()) {return 1;}i++;}return 0;}};