算法刷题Day 15 二叉树的层序遍历+翻转二叉树+对称二叉树

Day 15 二叉树

102. 二叉树的层序遍历

层序遍历二叉树需要借助到队列

class Solution {
public:
    vector<vector<int>> levelOrder(TreeNode* root) {
        if (root == nullptr) return {};

        queue<TreeNode*> que;
        vector<vector<int>> rst;

        que.push(root);
        TreeNode *cur;

        while (!que.empty())
        {
            int len = que.size();
            vector<int> level;
            while (len--)
            {
                cur = que.front();
                que.pop();
                level.push_back(cur->val);
                if (cur->left) que.push(cur->left);
                if (cur->right) que.push(cur->right);
            }
            rst.push_back(level);
        }

        return rst;
    }
};

226. 翻转二叉树

递归方法

class Solution {
public:
    TreeNode* invertTree(TreeNode* root) {
        if (root == nullptr) return root;
        invertTree(root->left);
        invertTree(root->right);
        swap(root->left, root->right);
        return root;
    }
};

迭代方法

就是简单的用上前序遍历迭代方法实现,不用想的太复杂

class Solution {
public:
    TreeNode* invertTree(TreeNode* root) {
        if (!root) return nullptr;
        stack<TreeNode*> stk;
        stk.push(root);
        TreeNode *cur;

        while (!stk.empty())
        {
            cur = stk.top();
            stk.pop();

            swap(cur->left, cur->right);
            if (cur->left) stk.push(cur->left);
            if (cur->right) stk.push(cur->right);
        }

        return root;
    }
};

101. 对称二叉树

递归方法

class Solution {
    bool helper(TreeNode *leftNode, TreeNode *rightNode)
    {
        if (leftNode == nullptr && rightNode == nullptr) return true;
        if (leftNode == nullptr || rightNode == nullptr) return false;
        if (leftNode->val == rightNode->val)
        {
            bool inSide = helper(leftNode->right, rightNode->left);
            bool outSide = helper(leftNode->left, rightNode->right);
            return inSide && outSide;
        }
        else return false;
    }

public:
    bool isSymmetric(TreeNode* root) {
        if (root == nullptr) return true;
        return helper(root->left, root->right);
    }
};

迭代方法

这里使用了队列来存放两个要比较的结点。也可以使用栈,方法是类似的。

class Solution {
public:
    bool isSymmetric(TreeNode* root) {
        if (root == nullptr) return true;
        queue<TreeNode*> que;
        que.push(root->left);
        que.push(root->right);

        while (!que.empty())
        {
            TreeNode *node1 = que.front();
            que.pop();
            TreeNode *node2 = que.front();
            que.pop();
            if (!node1 && !node2) continue;
            else if (!node1 || !node2 || node1->val != node2->val) return false;
            else
            {
                // outside
                que.push(node1->left);
                que.push(node2->right);
                // inside
                que.push(node1->right);
                que.push(node2->left);
            }
        }

        return true;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值