【LeetCode刷题日志】:翻转二叉树、对称二叉树

86 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第8天,点击查看活动详情

1、写在前面

大家好,这里是【LeetCode刷题日志】。今天的两道题分别是:

  • 翻转二叉树
  • 对称二叉树

2、内容

2.1、题目一

链接:226. 翻转二叉树 - 力扣(LeetCode)

(1) 描述

image.png

(2) 举例

image.png

image.png

image.png

(3) 解题

参考代码:

递归

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    TreeNode* invertTree(TreeNode* root) {
        TreeNode* cur = root;           // 定义一个工作结点
        if (cur == NULL) return cur;    // 如果当前结点为空,则结束递归
        swap(cur->left, cur->right);    // 交换左结点和右结点
        invertTree(cur->left);          // 反转左子树
        invertTree(cur->right);         // 反转右子树
        return cur;                     // 返回结点
    }
};

深度优先遍历(前序)

class Solution {
public:
    TreeNode* invertTree(TreeNode* root) {
        // 定义一个工作栈
        stack<TreeNode*> s;
        // 如果根结点不为空,则压入栈
        if (root != NULL) s.push(root);
        // 当栈为空时退出循环
        while (!s.empty()) {
            // 取到栈顶元素
            TreeNode* node = s.top();
            if (node != NULL) {
                // 如果结点不为空,则弹出该结点
                s.pop();
                if (node->right) s.push(node->right);  // 入队右结点
                if (node->left) s.push(node->left);    // 入队左结点
                s.push(node);                          // 将结点压入栈中
                s.push(NULL);                          // 添加 NULL 用于标记结点 
            }
            // 当遇到结点为NULL,则表明该结点的下面是欲访问的结点
            else{
                // 将标记结点弹出栈外
                s.pop();
                // 取到栈顶元素
                node = s.top();
                // 交换该栈顶元素的左右结点
                swap(node->left, node->right);
                // 弹出栈顶元素
                s.pop();
            }
        }
        // 最后返回结点即可
        return root;
    }
};

2.2、题目二

链接:101. 对称二叉树 - 力扣(LeetCode)

(1) 描述

image.png

(2) 举例

image.png

image.png

(3) 解题

参考代码:

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    bool isSymmetric(TreeNode* root) {
        // 如果根结点为空,则返回ture
        if (root == NULL) 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 == NULL && node2 != NULL) return false;     // 如果左结点为空,但右结点不为空,则返回 fasle
            if(node1 != NULL && node2 == NULL) return false;     // 如果左结点不为空,但右结点为空,则返回 fasle
            if ((node1 == NULL) && (node2  == NULL)) continue;   // 如果左结点和右结点都为空,则说明是对称的,进行下一轮循环
            if(node1->val != node2->val) return false;           // 如果左右结点都不为空,但是结点的值不同,则不对称
            que.push(node1->left);      // 加入左结点的左孩子
            que.push(node2->right);     // 加入右结点的右孩子
            que.push(node1->right);     // 加入左结点的右孩子
            que.push(node2->left);      // 加入右结点的左孩子
        }
        return true;
    }
};

3、写在最后

好的,今天就先刷到这里。