题目描述
请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。
代码一(错误的)
思想:通过中序遍历,把遍历的节点存入到list中去,然后判断list的头和尾,但是牛客通过为90%,原因是单独的中序遍历不能确定一棵树.所以当所有节点的值一样的时候就会出错误.
ArrayList<TreeNode> arr = new ArrayList<TreeNode>();
boolean isSymmetrical(TreeNode pRoot)
{
middleOrder(pRoot);
if(arr.size()==1||arr.size()==0)return true;
if(arr.size()%2==0)return false;
int i=0;
int j=arr.size()-1;
while(i<j) {
if(arr.get(i).val!=arr.get(j).val) {
return false;
}
i++;
j--;
}
return true;
}
public void middleOrder(TreeNode pRoot) {
if(pRoot!=null) {
middleOrder(pRoot.left);
arr.add(pRoot);
middleOrder(pRoot.right);
}
}
代码二
boolean isSymmetrical(TreeNode pRoot)
{
return pRoot==null||jude(pRoot.left,pRoot.right);
}
public boolean jude(TreeNode Node1,TreeNode Node2) {
if(Node1==null&&Node2==null) {
return true;
}
if(Node1==null||Node2==null) {
return false;
}
if(Node1.val!=Node2.val) {
return false;
}else {
return jude(Node1.left,Node2.right)&&jude(Node1.right,Node2.left);
}
}