当前位置: 面试刷题>> 对称二叉树(经典算法150题)
### 题目描述
**题目:对称二叉树**
给定一个二叉树,检查它是否是镜像对称的(也称为对称二叉树)。
一个二叉树是镜像对称的,当且仅当对于树中的每个节点 P 和 Q,其中 P 是左子树的一个节点且 Q 是右子树的一个节点,对于 P 的左子树中的任意节点都与 Q 的右子树中的对应节点镜像对称,反之亦然。
**示例 1**:
```
1
/ \
2 2
/ \ / \
3 4 4 3
```
这棵树是对称的。
**示例 2**:
```
1
/ \
2 2
\ \
3 3
```
这棵树不是对称的。
**注意**:
- 如果你可以运用递归解决问题,那么这是一个很好的练习。
- 题目中的树是通过节点类来定义的,每个节点包含整数值 `val`,以及指向其左子节点和右子节点的指针 `left` 和 `right`。
### PHP 示例代码
```php
class TreeNode {
public $val;
public $left;
public $right;
function __construct($val = 0, $left = null, $right = null) {
$this->val = $val;
$this->left = $left;
$this->right = $right;
}
}
class Solution {
/**
* @param TreeNode $root
* @return Boolean
*/
function isSymmetric($root) {
if ($root == null) {
return true;
}
return $this->isMirror($root->left, $root->right);
}
private function isMirror($node1, $node2) {
if ($node1 == null && $node2 == null) {
return true;
}
if ($node1 == null || $node2 == null || $node1->val != $node2->val) {
return false;
}
return $this->isMirror($node1->left, $node2->right) && $this->isMirror($node1->right, $node2->left);
}
}
```
### Python 示例代码
```python
class TreeNode:
def __init__(self, val=0, left=None, right=None):
self.val = val
self.left = left
self.right = right
class Solution:
def isSymmetric(self, root):
if not root:
return True
return self.isMirror(root.left, root.right)
def isMirror(self, node1, node2):
if not node1 and not node2:
return True
if not node1 or not node2 or node1.val != node2.val:
return False
return self.isMirror(node1.left, node2.right) and self.isMirror(node1.right, node2.left)
```
### JavaScript 示例代码
```javascript
function TreeNode(val, left, right) {
this.val = (val===undefined ? 0 : val)
this.left = (left===undefined ? null : left)
this.right = (right===undefined ? null : right)
}
var Solution = function() {};
Solution.prototype.isSymmetric = function(root) {
if (!root) {
return true;
}
return this.isMirror(root.left, root.right);
};
Solution.prototype.isMirror = function(node1, node2) {
if (!node1 && !node2) {
return true;
}
if (!node1 || !node2 || node1.val !== node2.val) {
return false;
}
return this.isMirror(node1.left, node2.right) && this.isMirror(node1.right, node2.left);
};
```
以上三种语言的示例代码均实现了检查二叉树是否对称的功能。通过递归调用 `isMirror` 函数来比较左右子树是否镜像对称。