给定一个二叉树,检查它是否是镜像对称的。
例如,二叉树 [1,2,2,3,4,4,3] 是对称的,[1,2,2,null,3,null,3] 则不是镜像对称的。
解法:
该问题可以转化为:两个树在什么情况下互为镜像?
如果同时满足下面的条件,两个树互为镜像:
1.它们的两个根结点具有相同的值。
2.每个树的右子树都与另一个树的左子树镜像对称。
PHP
/**
* Definition for a binary tree node.
* class TreeNode {
* public $val = null;
* public $left = null;
* public $right = null;
* function __construct($value) { $this->val = $value; }
* }
*/
class Solution {
/**
* 递归
* @param TreeNode $root
* @return Boolean
*/
function isSymmetric($root) {
return $this->isMirror($root,$root);
}
function isMirror($node1, $node2) {
if ($node1 == null && $node2 == null) {
return true;
}
if ($node1 == null || $node2 == null) {
return false;
}
return $node1->val == $node2->val
&& $this->isMirror($node1->left, $node2->right)
&& $this->isMirror($node1->right, $node2->left);
}
}
/**
* Definition for a binary tree node.
* class TreeNode {
* public $val = null;
* public $left = null;
* public $right = null;
* function __construct($value) { $this->val = $value; }
* }
*/
class Solution {
/**
* 队列
* @param TreeNode $root
* @return Boolean
*/
function isSymmetric($root) {
$queue = [];
array_push($queue, $root, $root);
while (!empty($queue)) {
$node1 = array_pop($queue);
$node2 = array_pop($queue);
if ($node1 == null && $node2 == null) {
continue;
}
if ($node1 == null || $node2 == null) {
return false;
}
if ($node1->val != $node2->val) {
return false;
}
array_push($queue, $node1->left, $node2->right, $node1->right, $node2->left);
}
return true;
}
}
GO
/**
* 递归
* Definition for a binary tree node.
* type TreeNode struct {
* Val int
* Left *TreeNode
* Right *TreeNode
* }
*/
func isSymmetric(root *TreeNode) bool {
return isMirror(root, root)
}
func isMirror(node1 *TreeNode, node2 *TreeNode) bool {
if node1 == nil && node2 == nil {
return true
}
if node1 == nil || node2 == nil {
return false
}
return node1.Val == node2.Val && isMirror(node1.Left, node2.Right) && isMirror(node1.Right, node2.Left)
}
/**
* 队列
* Definition for a binary tree node.
* type TreeNode struct {
* Val int
* Left *TreeNode
* Right *TreeNode
* }
*/
func isSymmetric(root *TreeNode) bool {
var queue []*TreeNode
queue = append(queue, root, root)
for {
len := len(queue)
if len == 0 {
return true
}
if len == 1 {
return false
}
node1 := queue[len - 1]
node2 := queue[len - 2]
queue = queue[:len -2]
if node1 == nil && node2 == nil {
continue
}
if node1 == nil || node2 == nil {
return false
}
if node1.Val != node2.Val {
return false
}
queue = append(queue, node1.Left, node2.Right, node1.Right, node2.Left)
}
}