Nowcoder java-对称的二叉树
(题目来自牛客网)
思路
方法一:递归法
首先根节点以及其左右子树
其次左子树的左子树和右子树的右子树相同
最后左子树的右子树和右子树的左子树相同即可。
方法二:利用栈
成对存,成对取
如果两个都为空,则返回true
如果一个为空,一个不为空,则返回false
如果两个都不为空,则判断两个两个节点的值是否相等,不相等直接返回false
方法三:利用队列
成对存,成对取
如果两个都为空,则返回true
如果一个为空,一个不为空,则返回false
如果两个都不为空,则判断两个两个节点的值是否相等,不相等直接返回false
代码
import java.util.LinkedList;
import java.util.Queue;
import java.util.Stack;
public class IsSymmetrical {
boolean isSymmetrical(TreeNode pRoot) {
//方法一:递归算法
// if (pRoot ==null){
// return true;
// }
// return isSymmetrical(pRoot.left,pRoot.right);
// }
// public boolean isSymmetrical(TreeNode left,TreeNode right){
// if (left == null && right == null){
// return true;
// }
// if (left==null || right ==null){
// return false;
// }
// return left.val == right.val && isSymmetrical(left.left,right.right)&& isSymmetrical(left.right , right.left);
// }
//方法二: 利用栈
//成对存,成对取
//如果两个都为空,则返回true
//如果一个为空,一个不为空,则返回false
//如果两个都不为空,则判断两个两个节点的值是否相等
// if (pRoot == null) {
// return true;
// }
// Stack<TreeNode> s= new Stack<>();
// s.push(pRoot.left);
// s.push(pRoot.right);
// while (!s.isEmpty()){
// TreeNode right = s.pop();
// TreeNode left = s.pop();
// if (left == null && right==null){
// continue;;
// }
// if (left == null || right==null){
// return false;
// }
// if (left.val != right.val){
// return false;
// }
// s.push(left.left);
// s.push(right.right);
// s.push(left.right);
// s.push(right.left);
// }
// return true;
// }
//方法三:队列
//成对存,成对取
//如果两个都为空,则返回true
//如果一个为空,一个不为空,则返回false
//如果两个都不为空,则判断两个两个节点的值是否相等
if (pRoot == null) {
return true;
}
Queue<TreeNode> q = new LinkedList<>();
q.offer(pRoot.left);
q.offer(pRoot.right);
while (!q.isEmpty()) {
TreeNode left = q.poll();
TreeNode right = q.poll();
if (left == null && right == null) {
continue;
}
if (left == null || right == null) {
return false;
}
if (left.val != right.val) {
return false;
}
q.offer(left.left);
q.offer(right.right);
q.offer(left.right);
q.offer(right.left);
}
return true;
}
}