请实现一个函数,用来判断一棵二叉树是不是对称的。如果一棵二叉树和它的镜像一样,那么它是对称的。
例如,二叉树 [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
示例 1:
输入:root = [1,2,2,3,4,4,3]
输出:true
示例 2:
输入:root = [1,2,2,null,3,null,3]
输出:false
0 <= 节点个数 <= 1000
这个题刚开始思路是在想对称的二叉树应该是有什么规律的,后面发现对称的二叉树的中序遍历结果是关于根节点对称的,但是在后面写出代码之后提交,很多样例过不了。想了才知道这种情况是只针对于满二叉树的情况,如果有叶子节点为空的话,这样的思路就过不了了,后面想了很久也没想到解决的办法
就去看题解看看有没有用这种方法解决的,发现都没有,,都是用递归,其实当时也是想过递归但是没想到怎么去递归,递归的方式一定要选好
最后写的思路是递归判断当前传进来的两个节点,如果都为空返回true,值不相等返回false,一个节点为空一个节点不为空返回false,再递归比较该第一个节点的左节点和该第二个节点的右节点以及该第一个节点的右节点和该第二个节点的左节点,这样递归下去就可以得到最终结果了
注意的是首先得特判根节点是不是为空,是的话直接返回true
再就是递归的方式,判断当前的两个节点就行
贴出代码:
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) {
if ($root == null) {
return true;
}
return $this->mid($root->left, $root->right);
}
//针对传进来的两个节点进行比较
function mid($left, $right)
{
//两个节点同时为空返回true
if ($left == null && $right == null) {
return true;
}
//两个值不相等返回false
if ($left->val != $right->val) {
return false;
}
//当一个节点为空一个节点不为空返回false,因为上面判了同时为空
if ($left == null || $right == null) {
return false;
}
//递归判断两个节点
return $this->mid($left->left, $right->right) && $this->mid($left->right, $right->left);
}
}