import java.util.LinkedList;
import java.util.Queue;
/**
* 面试题28:对称的二叉树
* 题目:请实现一个函数,用来判断一棵二叉树是不是对称的。如果一棵二叉树和它的镜像一样,那么它是对称的。
* @author
* @create 2021-05-02 22:25
*/
public class Solution28 {
public static void main(String[] args) {
TreeNode root = new TreeNode(8);
TreeNode node1 = new TreeNode(6);
TreeNode node2 = new TreeNode(6);
TreeNode node3 = new TreeNode(5);
TreeNode node4 = new TreeNode(7);
TreeNode node5 = new TreeNode(7);
TreeNode node6 = new TreeNode(5);
root.left = node1;
root.right = node2;
node1.left = node3;
node1.right = node4;
node2.left = node5;
node2.right = node6;
boolean symmetrical = isSymmetricalNoRecu(root);
System.out.println(symmetrical);
}
/**
* 方法一:递归实现
* @param pRoot
* @return
*/
public static boolean isSymmetrical(TreeNode pRoot) {
if (pRoot == null){
return true;
}
return isSymmetrical(pRoot.left, pRoot.right);
}
public static boolean isSymmetrical(TreeNode pRoot1, TreeNode pRoot2){
if (pRoot1 == null && pRoot2 == null){
return true;
}
if (pRoot1 == null || pRoot2 == null){
return false;
}
if (pRoot1.val != pRoot2.val){
return false;
}
return isSymmetrical(pRoot1.left, pRoot2.right)
&& isSymmetrical(pRoot1.right, pRoot2.left);
}
/**
* 方法二:非递归实现,使用队列
* @param pRoot
* @return
*/
public static boolean isSymmetricalNoRecu(TreeNode pRoot) {
if (pRoot == null){
return true;
}
Queue<TreeNode> leftqueue = new LinkedList<>();
Queue<TreeNode> rightqueue = new LinkedList<>();
leftqueue.add(pRoot.left);
rightqueue.add(pRoot.right);
while (!leftqueue.isEmpty() && !rightqueue.isEmpty()){
TreeNode leftNode = leftqueue.poll();
TreeNode rightNode = rightqueue.poll();
if (leftNode == null && rightNode == null){
continue;
}
if (leftNode == null || rightNode == null){
return false;
}
if (leftNode.val != rightNode.val){
return false;
}
leftqueue.add(leftNode.left);
rightqueue.add(rightNode.right);
leftqueue.add(leftNode.right);
rightqueue.add(rightNode.left);
}
return leftqueue.isEmpty() && rightqueue.isEmpty();
}
}
【剑指Offer】面试题28:对称的二叉树
最新推荐文章于 2022-03-25 20:56:10 发布