leetcode 链接:101. 对称二叉树
题目
给定一个二叉树,检查它是否是镜像对称的。
示例:
二叉树 [1,2,2,3,4,4,3] 是对称的。1/ \2 2/ \ / \3 4 4 3
[1,2,2,null,3,null,3] 则不是镜像对称的:
1
/ \
2 2
\ \
3 3
解答 & 代码
解法一:层序遍历
层序遍历得到每层的节点列表 levelNodes ,使用双指针从 levelNodes 左右两端往里移动,比较两端是否相等,如果有不相等的,返回 false
/**
* 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 == nullptr)
return true;
queue<TreeNode*> nodeQ;
nodeQ.push(root);
while(!nodeQ.empty()) // 层序遍历
{
int size = nodeQ.size();
vector<TreeNode*> levelNodes; // 存储当前层的节点(包括 nullptr)
for(int i = 0; i < size; ++i)
{
TreeNode* cur = nodeQ.front();
nodeQ.pop();
levelNodes.push_back(cur);
if(cur != nullptr)
{
nodeQ.push(cur->left);
nodeQ.push(cur->right);
}
}
// 双指针判断当前层的节点是否对称
int left = 0, right = levelNodes.size() - 1;
while(left <= right)
{
if((levelNodes[left] == nullptr && levelNodes[right] != nullptr) ||
(levelNodes[left] != nullptr && levelNodes[right] == nullptr) ||
(levelNodes[left] != nullptr && levelNodes[right] != nullptr && levelNodes[left]->val != levelNodes[right]->val))
return false;
++left;
--right;
}
}
return true;
}
};
执行结果:
执行结果:通过
执行用时:0 ms, 在所有 C++ 提交中击败了 100.00% 的用户
内存消耗:16.3 MB, 在所有 C++ 提交中击败了 5.03% 的用户
解法二:递归
/**
* 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 {
private:
// 递归比较两棵树是否对称
bool isTwoTreeSymmetric(TreeNode* root1, TreeNode* root2)
{
// 递归结束条件:若两个节点都为空,则返回 true,若一个为空一个不为空则返回 false
if(root1 == nullptr && root2 == nullptr)
return true;
else if(root1 == nullptr || root2 == nullptr)
return false;
// 只有同时满足以下三个条件才对称
return root1->val == root2->val && // 根节点值相同
isTwoTreeSymmetric(root1->left, root2->right) && // root1左子树和root2右子树对称
isTwoTreeSymmetric(root1->right, root2->left); // root1右子树和root2左子树对称
}
public:
bool isSymmetric(TreeNode* root) {
if(root == nullptr)
return true;
return isTwoTreeSymmetric(root->left, root->right);
}
};
执行结果:通过
执行用时:4 ms, 在所有 C++ 提交中击败了 86.33% 的用户
内存消耗:15.9 MB, 在所有 C++ 提交中击败了 66.02% 的用户
