1.题目描述
请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。
2.算法描述
对
称
树
满
足
:
对称树满足:
对称树满足:
1.
根
节
点
相
同
;
\red{1.根节点相同;}
1.根节点相同;
2.
根
节
点
左
右
子
树
相
同
;
\red{2.根节点左右子树相同;}
2.根节点左右子树相同;
3.
左
子
树
的
左
子
树
和
右
子
树
的
右
子
树
相
同
,
左
子
树
的
右
子
树
和
右
子
树
的
左
子
树
相
同
.
\red{3.左子树的左子树和右子树的右子树相同,左子树的右子树和右子树的左子树相同.}
3.左子树的左子树和右子树的右子树相同,左子树的右子树和右子树的左子树相同.
3.代码描述
3.1.Java代码
/*
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
*/
public class Solution {
boolean isSymmetrical(TreeNode pRoot){
if(pRoot == null) return true;//空树 认为是对称的
return helper(pRoot.left, pRoot.right);//不是空树,则判断左右子树
}
private boolean helper(TreeNode left, TreeNode right){
if(left == null && right == null) return true;//待判断的两棵子树都是空树,则是相同的子树
if(left == null || right == null) return false;//待判断的两棵子树只有一棵为空,则不是相同的子树
if(left.val != right.val) return false;//待判断的两棵子树结点元素值不相同,则不是相同的子树
else return helper(left.right, right.left) && helper(left.left, right.right);//判断子树1的右子树和子树2的左子树是否相同,子树1的左子树和子树2的右子树是否相同
}
}
3.2.Python代码
# -*- coding:utf-8 -*-
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def isSymmetrical(self, pRoot):
if not pRoot:
return True
return self.helper(pRoot.left, pRoot.right)
def helper(self, pLeft, pRight):
if pLeft==None and pRight==None:
return True
if pLeft==None or pRight==None:
return False
if pLeft.val != pRight.val:
return False
return self.helper(pLeft.right, pRight.left) and self.helper(pLeft.left, pRight.right)