leetcode151: symmetric tree
2016-04-30 21:03
453 查看
Given a binary tree, check whether it is a mirror of itself (ie, symmetric around its center).
给定一颗二叉树,判断该二叉树是否是对称的。
For example, this binary tree is symmetric:
如下面的二叉树是对称的。
Note:
Bonus points if you could solve it both recursively and iteratively.
提示:是否可以同时用递归和迭代的方法解决?
方法一:递归
方法二:迭代
给定一颗二叉树,判断该二叉树是否是对称的。
For example, this binary tree is symmetric:
如下面的二叉树是对称的。
1 / \ 2 2 / \ 3 3
Note:
Bonus points if you could solve it both recursively and iteratively.
提示:是否可以同时用递归和迭代的方法解决?
方法一:递归
public class SymmetricTree { static class TreeNode { int val; TreeNode left; TreeNode right; TreeNode(int x) { val = x; } } public boolean isSymmetric(TreeNode root) { if(root == null) return true; return isSymmetric(root.left, root.right); } public boolean isSymmetric(TreeNode leftNode, TreeNode rightNode){ if(leftNode == null && rightNode == null ) return true; if(leftNode == null || rightNode == null) return false; if(leftNode.val != rightNode.val) return false; boolean isLeft = isSymmetric(leftNode.left, rightNode.right); boolean isRight = isSymmetric(leftNode.right, rightNode.left); return isLeft && isRight; } public static void main(String args[]){ TreeNode root = new TreeNode(1); root.left = new TreeNode(2); root.right = new TreeNode(2); root.left.left = new TreeNode(3); root.left.right = new TreeNode(4); root.right.left = new TreeNode(4); root.right.right = new TreeNode(3); System.out.println(new SymmetricTree().isSymmetric(root)); System.out.println(new SymmetricTree().isSymmetricIter(root)); } }
方法二:迭代
public boolean isSymmetricIter(TreeNode root) { if(root == null) return true; Stack<TreeNode> leftStack = new Stack<TreeNode>(); Stack<TreeNode> rightStack = new Stack<TreeNode>(); leftStack.push(root.left); rightStack.push(root.right); while (leftStack.size() > 0 && rightStack.size() > 0){ TreeNode left = leftStack.pop(); TreeNode right = rightStack.pop(); if(left == null && right == null) continue; if(left == null || right == null) return false; if(left.val == right.val) { leftStack.push(left.right); leftStack.push(left.left); rightStack.push(right.left); rightStack.push(right.right); }else{ return false; } } return true; }
相关文章推荐
- 1048. 数字加密(20)
- C经典 快速实现加减乘除
- 第二次打字测试
- jquery操作DOM元素的复习
- PHP限制网页只能在微信内置浏览器中查看并显示
- Java循环练习:百鸡问题
- 时隔三年,重回代码之路
- 构建之法04
- servlet、jsp跳转(传值)总结及URL传参数
- linux内存源码分析 - 内存回收(lru链表)
- OSI七层模型与TCP/IP模型
- Unity3D 关于运动模型
- javascript 抽奖
- 游程幅值对数据_恢复图像块
- hdu 3247 AC自动+状压dp+bfs处理
- ztr loves math
- 登录的那些事
- 使用npm安装一些包失败了的看过来(npm国内镜像介绍)
- 两个小软件的分享
- ZOJ 3228 Searching the String(AC自动机)