226.翻转二叉树
题目:
给你一棵二叉树的根节点 root
,翻转这棵二叉树,并返回其根节点。
示例 1:
输入:root = [4,2,7,1,3,6,9] 输出:[4,7,2,9,6,3,1]
示例 2:
输入:root = [2,1,3] 输出:[2,3,1]
示例 3:
输入:root = [] 输出:[]
提示:
- 树中节点数目范围在
[0, 100]
内 -100 <= Node.val <= 100
思路:
其实就是交换一下左右节点,然后再递归的交换左节点,右节点
- 如果根节点为空,直接返回空。
- 否则,递归翻转左子树和右子树。
- 交换左右子树的位置。
我们可以总结出递归的两个条件如下:
终止条件:当前节点为 null 时返回
交换当前节点的左右节点,再递归的交换当前节点的左节点,递归的交换当前节点的右节点
上代码:
class Solution {
public:
TreeNode* invertTree(TreeNode* root) {
if (root == NULL) {
return NULL;
}
TreeNode* left = invertTree(root->left);
TreeNode* right = invertTree(root->right);
root->left = right;
root->right = left;
return root;
}
};
101. 对称二叉树
题目:
给你一个二叉树的根节点 root
, 检查它是否轴对称。
示例 1:
输入:root = [1,2,2,3,4,4,3] 输出:true
示例 2:
输入:root = [1,2,2,null,3,null,3] 输出:false
提示:
- 树中节点数目在范围
[1, 1000]
内 -100 <= Node.val <= 100
思路:
首先判断根节点是否为空,如果为空则直接返回 true,因为空树是对称的。
接下来创建一个队列 q,将根节点的左右子节点分别入队。
然后进入一个循环,当队列不为空时,取出队列中的两个节点 t1 和 t2,进行以下判断:
- 如果 t1 和 t2 都为空,说明当前层的两个节点都是空的,继续下一层的判断;
- 如果 t1 和 t2 中有一个为空,另一个不为空,说明不对称,返回 false;
- 如果 t1 和 t2 的值不相等,说明不对称,返回 false;
- 如果以上条件都不满足,说明当前层的两个节点对称,将它们的左右子节点分别按相反的顺序入队,继续下一层的判断。
最后,如果循环结束后没有提前返回 false,说明整个二叉树是对称的,返回 true。
上代码:
/**
* 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) {
if (root == NULL)
return true;
queue<TreeNode*> q;
q.push(root->left);
q.push(root->right);
while (!q.empty()) {
TreeNode* t1 = q.front();
q.pop();
TreeNode* t2 = q.front();
q.pop();
if (t1 == NULL && t2 == NULL)
continue;
if (t1 == NULL || t2 == NULL)
return false;
if (t1->val != t2->val)
return false;
q.push(t1->left);
q.push(t2->right);
q.push(t1->right);
q.push(t2->left);
}
return true;
}
};
标签:right,TreeNode,t2,随想录,第十四天,二叉树,root,节点,left
From: https://blog.csdn.net/xiaowutongxue666/article/details/141174826