leetcode 101. 对称二叉树(树)
程序员文章站
2022-05-20 13:18:44
...
给定一个二叉树,检查它是否是镜像对称的。
例如,二叉树 [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
code
递归版
根节点的左右子树分别DFS,注意递归顺序
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
bool isSymmetric(TreeNode* root) {
if(!root)
return true;
return isSymmetric(root->left,root->right);
}
bool isSymmetric(TreeNode* left,TreeNode* right){
if(!left && !right)
return true;
if(!left && right || left && !right || left->val!=right->val)
return false;
if(left->val==right->val)
return isSymmetric(left->right,right->left) && isSymmetric(left->left,right->right);
}
};
迭代版
根节点的左右子树分别BFS,注意push顺序
(我一开始是想直接BFS,然后看数组是不是对称的,然而因为空节点,不行的)
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
bool isSymmetric(TreeNode* root) {
if(!root)
return true;
queue<TreeNode*> q1,q2;
q1.push(root->left);
q2.push(root->right);
while(!q1.empty() && !q2.empty()){
TreeNode* p1 = q1.front();q1.pop();
TreeNode* p2 = q2.front();q2.pop();
if(!p1 && !p2)
continue;
if(!p1&&p2 || p1&&!p2 || p1->val!=p2->val)
return false;
q1.push(p1->left);
q1.push(p1->right);
q2.push(p2->right);
q2.push(p2->left);
}
return true;
}
};
上一篇: 145. 二叉树的后序遍历
下一篇: 栈---比较含退格的字符串
推荐阅读
-
Leetcode算法【114. 二叉树展开为链表】
-
二叉树(LeetCode) C++相关知识代码 系列1
-
荐 八十一、Python | Leetcode 二叉树系列(下篇)
-
2018NOIP普及T4---对称二叉树
-
PHP实现判断二叉树是否对称的方法
-
python数据结构(对称二叉树递归和迭代)
-
C++实现LeetCode(105.由先序和中序遍历建立二叉树)
-
C++实现LeetCode(889.由先序和后序遍历建立二叉树)
-
C++实现LeetCode(106.由中序和后序遍历建立二叉树)
-
leetcode 面试题32 (剑指offer)- II. 从上到下打印二叉树 II(python3)