100. 相同的树
给定两个二叉树,编写一个函数来检验它们是否相同。
如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。
示例 1:
输入: 1 1
/ /
2 3 2 3
[1,2,3], [1,2,3]
输出: true
示例 2:
输入: 1 1
/
2 2
[1,2], [1,null,2]
输出: false
示例 3:
输入: 1 1
/ /
2 1 1 2
[1,2,1], [1,1,2]
输出: false
源码:
1 /** 2 * Definition for a binary tree node. 3 * public class TreeNode { 4 * int val; 5 * TreeNode left; 6 * TreeNode right; 7 * TreeNode(int x) { val = x; } 8 * } 9 */ 10 class Solution { 11 public boolean isSameTree(TreeNode p, TreeNode q) { 12 if(p == null && q == null) 13 return true; 14 else if(!(p != null && q != null)) 15 return false; 16 else { 17 if(p.val == q.val) 18 return(isSameTree(p.left, q.left) && isSameTree(p.right, q.right)); 19 else 20 return false; 21 } 22 } 23 }
这道题我的解题思路是通过递归遍历这两个树。当两个树当前的节点对应的值相等时,调用自己的方法判断当前节点的左右两个子树是不是也是相同的树,递归终止的条件就是:如果两个树的当前节点都为空,返回true;一个树为空一个不为空,返回false;当前节点的值不相同,也返回false。
101. 对称二叉树
给定一个二叉树,检查它是否是镜像对称的。
例如,二叉树 [1,2,2,3,4,4,3]
是对称的。
1
/
2 2
/ /
3 4 4 3
但是下面这个 [1,2,2,null,3,null,3]
则不是镜像对称的:
1
/
2 2
3 3
说明:
如果你可以运用递归和迭代两种方法解决这个问题,会很加分。
这道题一看到,我就联想到了上面一题,我们只要从根节点处分开两个子树,同样用递归的方法判断两个子树是不是“相等”,这里只需要把在调用自身方法时的参数改成 “左等于右”&&”右等于左“ 即可,代码如下:
1 /** 2 * Definition for a binary tree node. 3 * public class TreeNode { 4 * int val; 5 * TreeNode left; 6 * TreeNode right; 7 * TreeNode(int x) { val = x; } 8 * } 9 */ 10 class Solution { 11 public boolean isSymmetric(TreeNode root) { 12 if(root == null) 13 return true; 14 else 15 return isMirror(root.left, root.right); 16 } 17 public boolean isMirror(TreeNode m, TreeNode n) { 18 if(m == null & n == null) 19 return true; 20 else if(m !=null && n !=null && m.val == n.val) 21 return (isMirror(m.left, n.right) && isMirror(m.right, n.left)); 22 else 23 return false; 24 } 25 }
执行用时 : 1 ms, 在Symmetric Tree的Java提交中击败了99.59% 的用户
内存消耗 : 34.8 MB, 在Symmetric Tree的Java提交中击败了85.06% 的用户
按照题目要求,还可以用循环的方法做这道题。我的思路是,设定两个 List,分别代表从根节点分开的左边的树和右边的树,在设定两个 int 类型变量作为 List 的光标(index),将两个子树的头加入 List 中。循环体中:当两个树对应节点处的值相等,则将左边树的左、右子节点依次加入 List1,对应的将右边树的右、左子节点;依次加入 List2,然后两个光标自加;若对应节点都为空,则光标自加,然后 continue 继续下一次循环;若只有一个为空,返回 false;其他情况也返回 false。循环的终止条件是,光标的值不小于 List 的长度了,也就是任意一个 List 的每个元素已经循环完了。若循环结束,最后此方法返回 true。
1 /** 2 * Definition for a binary tree node. 3 * public class TreeNode { 4 * int val; 5 * TreeNode left; 6 * TreeNode right; 7 * TreeNode(int x) { val = x; } 8 * } 9 */ 10 class Solution { 11 public boolean isSymmetric(TreeNode root) { 12 if (root == null) 13 return true; 14 List<TreeNode> l1 = new ArrayList<TreeNode>(); 15 List<TreeNode> l2 = new ArrayList<TreeNode>(); 16 l1.add(root.left); 17 l2.add(root.right); 18 int cur1 = 0; 19 int cur2 = 0; 20 while(cur1 < l1.size() && cur2 < l2.size()) { 21 if(l1.get(cur1) == null && l2.get(cur2) == null) { 22 cur1++; 23 cur2++; 24 continue; 25 } 26 else if(l1.get(cur1) == null || l2.get(cur2) == null) 27 return false; 28 else if(l1.get(cur1).val == l2.get(cur2).val) { 29 l1.add(l1.get(cur1).left); 30 l1.add(l1.get(cur1++).right); 31 l2.add(l2.get(cur2).right); 32 l2.add(l2.get(cur2++).left); 33 } 34 else 35 return false; 36 } 37 return true; 38 } 39 }
执行用时 : 3 ms, 在Symmetric Tree的Java提交中击败了64.39% 的用户
内存消耗 : 34.6 MB, 在Symmetric Tree的Java提交中击败了88.39% 的用户