文章目录
- 零、原题链接
- 一、题目描述
- 二、测试用例
- 三、解题思路
- 3.1 递归
- 3.2 迭代
- 四、参考代码
- 4.1 递归
- 4.2 迭代
零、原题链接
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
三、解题思路
3.1 递归
- 基本思路:
递归,比较对称位置的结点是否相同即可 - 具体思路:
- 左子树结点和右子树结点有一个为空,另一个非空,则不轴对称;
- 两个都是空,则轴对称;
- 两个都不为空:
- 值相同,则判断
左子树的左子树
和右子树的右子树
是否轴对称 且左子树的右子树
和右子树的左子树
是否轴对称; - 值不同,则不是轴对称;
- 值相同,则判断
3.2 迭代
- 基本思路:
迭代,用栈实现递归,还是比较对称位置的结点是否相同即可 - 具体思路:
- 将左右子树入栈;
- 只要栈非空:
- 弹出两个元素,比较是否相同:
- 相同,非空的话,将他们的左右子树间隔入栈,且顺序相反,即一个左右,一个右左;
- 不相同,则不是轴对称;
- 弹出两个元素,比较是否相同:
- 栈空,则表示是轴对称;
四、参考代码
4.1 递归
时间复杂度:
O
(
n
)
\Omicron(n)
O(n)
空间复杂度:
O
(
l
o
g
n
)
\Omicron(log\;n)
O(logn)
/**
* 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* left, TreeNode* right) {
if ((left == nullptr) ^ (right == nullptr))
return false;
else if (left == nullptr)
return true;
else {
if (left->val == right->val)
return isSymmetric(left->left, right->right) &&
isSymmetric(left->right, right->left);
else
return false;
}
}
bool isSymmetric(TreeNode* root) {
return isSymmetric(root->left, root->right);
}
};
4.2 迭代
时间复杂度:
O
(
n
)
\Omicron(n)
O(n)
空间复杂度:
O
(
l
o
g
n
)
\Omicron(log\;n)
O(logn)
/**
* 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) {
vector<TreeNode*> stack;
stack.push_back(root->left);
stack.push_back(root->right);
while (!stack.empty()) {
TreeNode* left = stack.back();
stack.pop_back();
TreeNode* right = stack.back();
stack.pop_back();
if (left != nullptr && right != nullptr) {
if (left->val == right->val) {
stack.push_back(left->left);
stack.push_back(right->right);
stack.push_back(left->right);
stack.push_back(right->left);
} else {
return false;
}
} else if (left != nullptr || right != nullptr) {
return false;
}
}
return true;
}
};