思路一:这里作者用了前序遍历的方法,并对前序遍历稍作了修改,对这个树的左右子树进行遍历并用集合进行了存储(即使是遍历到空结点也需要向里面添加null),然后比较两个集合中的元素是否一一对应。如出现一个不对应的地方,就直接返回false。遍历结束,还是没有出现不对应的地方,就说明这是一个轴对称的树。
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public boolean isSymmetric(TreeNode root) {
if(root==null)
return false;
List list1=new ArrayList();
qianxu1(root.left,list1);
List list2=new ArrayList();
qianxu2(root.right,list2);
if(list1.size()!=list2.size())
return false;
int len=Math.max(list1.size(),list2.size());
for(int i=0;i<len;i++){
if(list1.get(i)!=list2.get(i)){
return false;
}
}
return true;
}
public void qianxu1(TreeNode t,List list){
if(t==null)
{
list.add("null");
return;
}
else{
list.add(t.val);
qianxu1(t.left,list);
qianxu1(t.right,list);
}
}
public void qianxu2(TreeNode t,List list){
if(t==null)
{
list.add("null");
return;
}
list.add(t.val);
qianxu2(t.right,list);
qianxu2(t.left,list);
}
}
思路二:可以递归同时进行,依次指向两节点其中的一个结点的左子树,和另一个结点的右子树,判断其某节点的左子树和另一个结点的右子树的元素是不是相同。一开始作者有这个思路,但是因为空指针异常,放弃了这个做法,是因为作者觉得根结点是特殊的,最多只有两个儿子,不需要颠倒左右子树;但即使这样也可以这样写,顶多就是重复而已,对于下面的结点就不一样了,有自己的左子树右子树。
当时在写这种思路的时候,提前去判断当前结点的左子树和右子树的元素是否相同,这样就会导致不知道当前结点的左子树或者右子树是否存在,也就会抛出指针异常的问题。给我的教训就是,有指针的地方,必须首先判断当前指针的有无,不要提前去判断下一次递归的指针的元素。然后再去递归下面可能存在的指针,在下一次递归中判断这个可能存在的指针到底是不是存在,也就是写在递归函数最前面判断指针是不是null的部分判断。
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public boolean isSymmetric(TreeNode root) {
if(root==null)
return false;
return bianli(root,root);
}
public boolean bianli(TreeNode t1,TreeNode t2){
if(t1==null&&t2==null)
return true;
if(t1==null||t2==null)
return false;
if(t1.val==t2.val){
return bianli(t1.left,t2.right)&&bianli(t1.right,t2.left);
}
else
return false;
}
}