leetcode - 101. Symmetric Tree
2018-01-28 20:45
453 查看
Problem:
Given a binary tree, check whether it is a mirror of itself (ie, symmetric around its center).
For example, this binary tree
symmetric:
But the following
not:
Note:
Bonus points if you could solve it both recursively and iteratively.
解释:给定一个树,判断这棵树是否是沿着中间对称(数值)。(用递归和非递归解决。)
Solve:
1.emm 想了很久写了个非递归的,就是沿着树逐层读取,判断这一层是否中心对称。(时间复杂度O(n^n),AC-152ms)
这个AC时间真的炸了,排最后算是。不过前面快的都是递归。不知道非递归的其他时间怎么样。贴代码:
2.搬运个递归的算法:看完才恍然大悟。
后记:看来我要好好学下递归了
Given a binary tree, check whether it is a mirror of itself (ie, symmetric around its center).
For example, this binary tree
[1,2,2,3,4,4,3]is
symmetric:
1 / \ 2 2 / \ / \ 3 4 4 3
But the following
[1,2,2,null,3,null,3]is
not:
1 / \ 2 2 \ \ 3 3
Note:
Bonus points if you could solve it both recursively and iteratively.
解释:给定一个树,判断这棵树是否是沿着中间对称(数值)。(用递归和非递归解决。)
Solve:
1.emm 想了很久写了个非递归的,就是沿着树逐层读取,判断这一层是否中心对称。(时间复杂度O(n^n),AC-152ms)
这个AC时间真的炸了,排最后算是。不过前面快的都是递归。不知道非递归的其他时间怎么样。贴代码:
public static int getMaxDepth(TreeNode root) {//获取树的深度 if (root == null){ return 0; } else { int left = getMaxDepth(root.left); int right = getMaxDepth(root.right); return 1 + Math.max(left, right); } }
public static boolean isSymmetric(TreeNode root) { ArrayList<ArrayList<TreeNode>> arrayLists=new ArrayList<>();//大集合保存所有层(每个小集合) ArrayList<TreeNode> TarrayList=new ArrayList<>();//小集合保存每一层的所有结点 TarrayList.add(root);//先储存根结点 arrayLists.add(TarrayList); int depth=getMaxDepth(root);//求树的深度 for(int i=0;i<depth-1;i++){//逐层遍历 ArrayList<TreeNode> TempTarrayList=new ArrayList<>();//用于保存这一层所有的结点 for(int j=0;j<arrayLists.get(i).size();j++){//对上一层的所有结点进行遍历,得到这一层的结点(父结点 得到 子结点) if(arrayLists.get(i).get(j)==null){//父节点为空,仍要生成两个空的子结点, TempTarrayList.add(null); TempTarrayList.add(null); }else { TempTarrayList.add(arrayLists.get(i).get(j).left); TempTarrayList.add(arrayLists.get(i).get(j).right); } } arrayLists.add(TempTarrayList); for (int j = 0; j <TempTarrayList.size()/2; j++) {//判断这一层结点是否中间对称 if(TempTarrayList.get(j)!=null&&TempTarrayList.get((int)Math.pow(2,i+1)-j-1)!=null){//结点非空, if(TempTarrayList.get(j).val!=TempTarrayList.get((int)Math.pow(2,i+1)-j-1).val) {//判断数值是否相同 return false; } }else if(TempTarrayList.get(j)==null&&TempTarrayList.get((int)Math.pow(2,i+1)-j-1)==null){//结点都为空的情况 不用判断,等同于数值相同的情况 }else {//其他情况 如两个相对称的结点 :左结点空 右结点非空 该树不对称 return false; } } } return true; }
2.搬运个递归的算法:看完才恍然大悟。
public boolean isSymmetric(TreeNode root) { return root == null || isSymmetric(root.left, root.right); } private boolean isSymmetric(TreeNode left, TreeNode right) { int nu = (left == null ? 1 : 0) + (right == null ? 1 : 0); if (nu == 1) return false; if (nu == 2) return true; return left.val == right.val && isSymmetric(left.left, right.right) && isSymmetric(left.right, right.left); }
后记:看来我要好好学下递归了
相关文章推荐
- LeetCode *** 101. Symmetric Tree
- LeetCode-101. Symmetric Tree
- C++详解Leetcode:101. Symmetric Tree
- <LeetCode OJ> 101. Symmetric Tree
- LeetCode - 101. Symmetric Tree (C++)
- leetcode 101. Symmetric Tree
- 【LeetCode】 101. Symmetric Tree
- leetcode 101. Symmetric(对称的) Tree
- LeetCode 101. Symmetric Tree
- 【leetcode】101. Symmetric Tree【java】递归和非递归两种方法
- [Leetcode] 101. Symmetric Tree 解题报告
- LeetCode 101. Symmetric Tree (对称树)
- [LeetCode]101. Symmetric Tree
- leetcode 101. Symmetric Tree 解题笔记
- [leetcode] 101. Symmetric Tree
- LeetCode101. Symmetric Tree
- LeetCode解题报告 101. Symmetric Tree [easy]
- 【Leetcode】101. Symmetric Tree
- 【LeetCode】101. Symmetric Tree
- Leetcode 101. Symmetric Tree