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]);//最后一列从下往上
            }
        }
    }
};