开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第8天,点击查看活动详情
1、写在前面
大家好,这里是【LeetCode刷题日志】。今天的两道题分别是:
- 翻转二叉树
- 对称二叉树
2、内容
2.1、题目一
(1) 描述
(2) 举例
(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、题目二
(1) 描述
(2) 举例
(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、写在最后
好的,今天就先刷到这里。