二叉树相关问题2-完全二叉树、相同二叉树、反转二叉树


	/*
	 * 二叉树是否是完全二叉树
	 * 层次遍历二叉树
		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;
	}

 

转载于:https://my.oschina.net/woniuyi/blog/3030938

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值