1.二叉树的镜像
思路:先前序遍历树的每个节点,如果遍历到的节点有子节点,就交换它的两个子节点。当交换完所有非叶子节点的左、右子节点之后,就得到了树的镜像。
/* struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) { } };*/ class Solution { public: void Mirror(TreeNode *pRoot) { if(pRoot==nullptr) return; if(pRoot->left==nullptr&&pRoot->right==nullptr) return;//左右子树都为null才返回 TreeNode *temp=pRoot->left; pRoot->left=pRoot->right; pRoot->right=temp;//交换左右子树 if(pRoot->left) Mirror(pRoot->left);//递归交换左子树 if(pRoot->right) Mirror(pRoot->right);//递归交换右子树 } };
2.对称的二叉树(如果与树的镜像相等说明此树是对称的)
思路:通过比较二叉树的前序遍历和对称前序遍历来判断二叉树是否对称,注意要包含nullptr的子节点。
/* struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) { } }; */ class Solution { public: bool isSymmetrical(TreeNode* pRoot) { return judge(pRoot,pRoot); } bool judge(TreeNode* pRoot1,TreeNode* pRoot2) { if(pRoot1==nullptr&&pRoot2==nullptr) return true; if(pRoot1==nullptr||pRoot2==nullptr) return false; if(pRoot1->val!=pRoot2->val) return false; return judge(pRoot1->left,pRoot2->right)&&judge(pRoot1->right,pRoot2->left); } };
3.顺时针打印矩阵
(1):我们可以发现左上角的坐标中行标和列标总是相同的,于是可以在矩阵中选取左上角为(start,start)的一圈作为分析的目标。可以发现,循环的条件是列与行都大于start×2;
(2):打印一圈需要检查的内容,第一步(从左到右)一定是需要的,第二步执行的前提条件是终止行号要大于起始行号,第三步的执行条件是圈内至少有两行两列,也就是说要要求终止行号大于起始行号,终止列号也要大于起始列号,第四步的执行条件是至少有三行两列,因此要求终止行号比起始行号至少大2,同时终止列号大于起始列号。
class Solution { public: vector<int> printMatrix(vector<vector<int> > matrix) { int start=0; vector<int> result; if(matrix.size()==0||matrix[0].size()==0) return result; int row=matrix.size();//行 int col=matrix[0].size();//列 while(row>start*2&&col>start*2) { print(row,col,start,result,matrix); start++;//决定打印几圈 } return result; } void print(int row,int col,int start,vector<int> &result,vector<vector<int> > &matrix) { int endX=col-1-start;//横坐标,x轴,横向 int endY=row-1-start;//纵坐标,y轴,纵向 for(int i=start;i<=endX;i++) { result.push_back(matrix[start][i]);//第一行从左往右 } if(endY>start) { for(int i=start+1;i<=endY;i++) { result.push_back(matrix[i][endX]);//最后一列从上往下 } } if(endX>start&&endY>start) { for(int i=endX-1;i>=start;i--) { result.push_back(matrix[endY][i]);//最后一行从左往右 } } if(endX>start&&endY>start+1) { for(int i=endY-1;i>=start+1;i--) { result.push_back(matrix[i][start]);//最后一列从下往上 } } } };