这两道题,大同小异。 我都是用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 }
LeetCode OJ - Symmetric Tree && Same Tree,布布扣,bubuko.com
时间: 2024-10-25 02:58:02