Leetcode 剑指 Offer 27~29

27. 二叉树的镜像

/**
 * 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:
    TreeNode* mirrorTree(TreeNode* root) {
        if (root)
            mirrorTreeCore(root);
        return root;
    }

    void mirrorTreeCore(TreeNode* p) {
        swap(p->left, p->right);
        if (p->left)
            mirrorTreeCore(p->left);
        if (p->right)
            mirrorTreeCore(p->right);
    }
};

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) {
        return isSymmetricCore(root, root);
    }

    bool isSymmetricCore(TreeNode* a, TreeNode* b) {
        if (!a && !b)
            return true;
        if (a && b) {
            if (a->val != b->val)
                return false;
            return isSymmetricCore(a->left, b->right)
                && isSymmetricCore(a->right, b->left);
        }
        return false;
    }
};

29. 顺时针打印矩阵

class Solution {
public:
    // 前进方向,分别表示右下左上
    vector<vector<int> > direction{
        {0, 1},
        {1, 0},
        {0, -1},
        {-1, 0},
    };

    vector<int> spiralOrder(vector<vector<int>>& matrix) {
        if (matrix.empty() || matrix[0].empty())
            return vector<int>();
        int m = matrix.size(), n = matrix[0].size(), steps = m * n;
        vector<int> ans;
        vector<vector<bool>> visited(m, vector<bool>(n, false));
        int y = 0, x = 0, dir = 0;
        for (int i = 0; i < steps; ++i)
            spiralOrderCore(matrix, ans, visited, m, n, y, x, dir);
        return ans;
    }

    void spiralOrderCore(vector<vector<int>>& matrix, vector<int>& ans,
            vector<vector<bool>>& visited, const int m, const int n,
            int& y, int& x, int& dir) {
        visited[y][x] = true;
        ans.push_back(matrix[y][x]);
        // 探索是否需要更改前进方向
        int newY = y + direction[dir][0];
        int newX = x + direction[dir][1];
        if (newY < 0 || newY >= m || newX < 0 || newX >= n || visited[newY][newX])
            dir = (dir + 1) % 4;
        // 前进一格
        y += direction[dir][0];
        x += direction[dir][1];
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值