59 对称的二叉树 《剑指offer》 101. 对称二叉树《LeetCode》

题目描述
请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。

import java.util.*;
public class Solution {
    ArrayList<Integer> list1 = new ArrayList();
    ArrayList<Integer> list2 = new ArrayList();
    public void unPreOrder(TreeNode root){
        if(root == null)
            list1.add(null);
       else{
            list1.add(root.val);
            unPreOrder(root.right);
            unPreOrder(root.left);
       }
    }
    public void preOrder(TreeNode root){
        if(root == null)
            list2.add(null);
        else{
            list2.add(root.val);            
            preOrder(root.left);
            preOrder(root.right);
        }

    }
    boolean isSymmetrical(TreeNode pRoot)
    {
        if(pRoot == null)
            return true;
        unPreOrder(pRoot);
        preOrder(pRoot);    
        for(int i=0;i<list1.size();i++){
            if(list1.get(i) != list2.get(i))
                return false;
        }
        return true;
    }
}

本来想使用一个镜像函数来做,发现使用后,原来的树节点就变成它的镜像了,无法进行比较。
做一个先序遍历的对称遍历,然后比较他们的元素。为了避免树中所有节点都相同,存储的时候还带了null节点。
可以通过比较二叉树的前序遍历和二叉树对称前序遍历来判断二叉树是不是对称的。
还是那一套,一种是先遍历,保存在数组中,然后进行处理(判断两数组是否相同);

另一种是在遍历的同时进行判断处理。
意识到镜像是当前二叉树将所有的左右节点进行交换而生成的,所以:

public class Solution {

    boolean isSymmetrical(TreeNode root1,TreeNode root2){
        if(root1 == null && root2 == null)
            return true;
        if(root1 == null || root2 == null)
            return false;
        if(root1.val != root2.val)
            return false;
        return isSymmetrical(root1.left,root2.right)  
                             && isSymmetrical(root1.right,root2.left); 
    }
    boolean isSymmetrical(TreeNode pRoot)
    {
        return isSymmetrical(pRoot,pRoot);
    }
}

LeetCode的代码:

class Solution {
    public boolean leftEqualsRight(TreeNode root1,TreeNode root2) {
        if(root1 == null && root2 == null)
            return true;
        if(root1 == null || root2 == null)
            return false;
        //if(root1.val == root2.val)
           // return true;
        if(root1.val != root2.val)
            return false;
        return leftEqualsRight(root1.left,root2.right) && leftEqualsRight(root1.right,root2.left);
    }

    public boolean isSymmetric(TreeNode root) {
        if(root == null)
            return true;
        return leftEqualsRight(root,root);
    }
}

注意,我的错误: //if(root1.val == root2.val) // return true;显然这个不是递归的终结条件!

猜你喜欢

转载自blog.csdn.net/xuchonghao/article/details/80519152
今日推荐