首页 > 代码库 > LeetCode OJ - Symmetric Tree && Same Tree

LeetCode OJ - Symmetric Tree && Same Tree

这两道题,大同小异。 我都是用BFS,在遍历的过程,判断结构是否相同/对称,值是否相同。

下面是AC代码:

  1 /**
  2      * Given a binary tree, check whether it is a mirror of itself (ie, symmetric around its center).
  3      * @param root
  4      * @return
  5      */
  6     public boolean isSymmetricRecursively(TreeNode root){
  7         if(root == null)
  8             return true;
  9         return isSymmetricR(root.left, root.right);
 10     }
 11     /**
 12      * 采用迭代的方式,输入的是两个对称位置的节点,如果以这两个节点为root的子树是对称的,则
 13      * 左边的左子树和右边的右子树相同,且左边的右子树和右边的左子树相同,且这两个子树的树根的值相等
 14      * @param left
 15      * @param right
 16      * @return
 17      */
 18     private boolean isSymmetricR(TreeNode left, TreeNode right){
 19         if(left== null && right == null)
 20             return true;
 21         if(left == null && right!=null || right == null && left!=null)
 22             return false;
 23         if(left.left == null && left.right == null &&
 24                 right.left == null && right.right == null)
 25             return left.val == right.val;
 26         boolean f1 = (left.val == right.val);
 27         boolean l1 = isSymmetricR(left.left, right.right);
 28         boolean r1 = isSymmetricR(left.right, right.left);
 29         return f1&&l1&&r1;
 30         
 31     }
 32     /**
 33      * Given a binary tree, check whether it is a mirror of itself (ie, symmetric around its center).
 34      * solve it iteratively
 35      * @param root
 36      * @return
 37      */
 38     public boolean isSymmetricIteratively(TreeNode root){
 39         if(root == null || (root.left == null && root.right == null))
 40             return true;
 41         LinkedList<TreeNode> qleft = new LinkedList<TreeNode>();
 42         LinkedList<TreeNode> qright = new LinkedList<TreeNode>();
 43         
 44         if(root.left!=null && root.right == null ||
 45                 root.right!=null && root.left == null)
 46             return false;
 47         qleft.offer(root.left);
 48         qright.offer(root.right);
 49         
 50         while(!qleft.isEmpty() && !qright.isEmpty()){
 51             TreeNode left = qleft.poll();
 52             TreeNode right = qright.poll();
 53             
 54             if(left.val != right.val)
 55                 return false;
 56             
 57             if(left.right != null && right.left!=null){
 58                 qleft.offer(left.right);
 59                 qright.offer(right.left);
 60             }else if(left.right!= null && right.left == null ||
 61                     left.right == null && right.left !=null)
 62                 return false;
 63             
 64             if(right.right != null && left.left!=null){
 65                 qleft.offer(left.left);
 66                 qright.offer(right.right);
 67             }else if(right.right!= null && left.left == null ||
 68                     right.right == null && left.left !=null)
 69                 return false;
 70         }
 71         return true;
 72     }
 73     /**
 74      * by BFS, to check if they are equal or not
 75      * Two binary trees are considered equal if they are structurally identical and the nodes have the same value.
 76      * @param p
 77      * @param q
 78      * @return
 79      */
 80     public boolean isSameTree(TreeNode p, TreeNode q){
 81         if(p == null && q == null)
 82             return true;
 83         if(p == null && q!=null || p!=null && q==null)
 84             return false;
 85         LinkedList<TreeNode> pqueue = new LinkedList<TreeNode>();
 86         LinkedList<TreeNode> qqueue = new LinkedList<TreeNode>();
 87         
 88         pqueue.offer(p);
 89         qqueue.offer(q);
 90         
 91         while(!pqueue.isEmpty() && !qqueue.isEmpty()){
 92             TreeNode pC = pqueue.poll();
 93             TreeNode qC = qqueue.poll();
 94             //have same value
 95             if(pC.val!=qC.val)
 96                 return false;
 97             //structurally identical or not
 98             if(pC.left!=null && qC.left == null ||
 99                     pC.left == null && qC.left!=null)
100                 return false;
101             else if(pC.left!=null && qC.left!=null){
102                 pqueue.offer(pC.left);
103                 qqueue.offer(qC.left);
104             }
105             
106             if(pC.right == null && qC.right != null || 
107                     pC.right!=null && qC.right == null)
108                 return false;
109             else if(pC.right!=null && qC.right!=null){
110                 pqueue.offer(pC.right);
111                 qqueue.offer(qC.right);
112             }
113         }
114         /**
115          * there is no need
116          * if(pqueue.isEmpty() && !qqueue.isEmpty() ||
117                 qqueue.isEmpty() && !pqueue.isEmpty())
118             return false;
119         */
120         return true;
121     }