本文最后更新于:2022年9月7日 晚上
给定一个二叉树,检查它是否是镜像对称的。
例如,二叉树 [1,2,2,3,4,4,3]
是对称的。
但是下面这个 [1,2,2,null,3,null,3]
则不是镜像对称的:
进阶:
你可以运用递归和迭代两种方法解决这个问题吗?
Solution
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
|
class Solution { public: bool isSymmetric(TreeNode* root) { if(root==nullptr) return true; return isSym(root->left, root->right); } private: bool isSym(TreeNode* l1, TreeNode* l2){ if(l1==nullptr && l2==nullptr) return true; else if(l1==nullptr || l2==nullptr) return false; else if(l1->val != l2->val) return false; return isSym(l1->left, l2->right) && isSym(l1->right, l2->left); } };
|
参考 LeetCode官方
- 迭代法
- 引入一个队列 / 栈,这是把递归程序改写成迭代程序的常用方法。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
|
class Solution { public: bool isSymmetric(TreeNode* root) { if(root==nullptr) return true; queue<TreeNode *> q; TreeNode* u = root->left; TreeNode* v = root->right; q.push(u); q.push(v); while(!q.empty()){ u = q.front(); q.pop(); v = q.front(); q.pop(); if(!u && !v) continue; else if(!u || !v) return false; else if(u->val != v->val) return false; q.push(u->left); q.push(v->right);
q.push(u->right); q.push(v->left); } return true; } };
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| class Solution { public: bool isSymmetric(TreeNode* root) { if (root == nullptr) return true; stack<TreeNode *> stack; TreeNode *u = root->left; TreeNode *v = root->right; stack.push(u); stack.push(v); while (!stack.empty()) { v = stack.top(); stack.pop(); u = stack.top(); stack.pop(); if (!u && !v) continue; else if (!u || !v) { return false; } else if (u->val != v->val) { return false; } stack.push(u->left); stack.push(v->right);
stack.push(u->right); stack.push(v->left); } return true; } };
|
java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| class Solution { public boolean isSymmetric(TreeNode root) { if (root == null) { return false; } return isSame(root.left, root.right); }
private boolean isSame(TreeNode node1, TreeNode node2) { if (node1 == null && node2 == null) { return true; } else if (node1 == null || node2 == null) { return false; } else if (node1.val != node2.val) { return false; } else { return isSame(node1.left, node2.right) && isSame(node1.right, node2.left); } } }
|