/*
* 二叉树是否是完全二叉树
* 层次遍历二叉树
1 任何一个结点如果右孩子不为空,左孩子却是空,则一定不是完全二叉树
2 当一个结点出现右孩子为空时候,判断该结点的层次遍历后继结点是否为叶子节点,如果全部都是叶子节点,则是完全二叉树;
如果存在任何一个结点不是叶节点,则一定不是完全二叉树。
*/
public boolean isCompleteBinaryTree(Node node) {
if (node==null) {
return false;
}
Queue<Node> queue=new LinkedList<>();
boolean hasRightChild=true;//当前节点有右孩子,默认
queue.add(node);
while (!queue.isEmpty()) {
Node cur = queue.poll();
if (!hasRightChild&&(cur.left!=null||cur.right!=null)) {
// 如果之前层遍历的结点没有右孩子,且当前的结点有左或右孩子,直接返回false
return false;
}
if (cur.right!=null&&cur.left==null) {
// 如果当前结点有右孩子却没有左孩子,直接返回false
return false;
}
if (cur.left!=null) {
queue.add(cur.left);
}
if (cur.right!=null) {
queue.add(node.right);
}else {
// 如果当前结点没有右孩子,那么之后层遍历到的结点必须为叶子结点
hasRightChild=false;
}
}
return true;
}
//两个二叉树是否完全相同
public boolean isSameTree(Node node1,Node node2) {
if (node1==null&&node2==null) {
return true;
}
if (node1==null||node2==null) {
return false;
}
if (node1.value!=node2.value) {
return false;
}
return isSameTree(node1.left, node2.left)
&&isSameTree(node1.right, node2.right);
}
//两个二叉树是否互为镜像
public boolean isMirroredTree(Node node1,Node node2) {
if (node1==null&&node2==null) {
return true;
}
if (node1==null||node2==null) {
return false;
}
if (node1.value!=node2.value) {
return false;
}
return isMirroredTree(node1.left,node2.right)&&
isMirroredTree(node1.right,node2.left);
}
//反转二叉树||镜像二叉树
public Node reverse(Node node) {
if (node==null) {
return null;
}
Node tmp=node.left;
node.left=reverse(node.right);
node.right=reverse(tmp);
return node;
}
//反转二叉树||镜像二叉树
public Node reverse1(Node node) {
if (node==null) {
return null;
}
Node left=reverse(node.left);
Node right=reverse(node.right);
node.left=right;
node.right=left;
return node;
}