02_二叉树——层序遍历的应用

层序遍历的应用

  • 计算二叉树的高度
  • 判断一棵树是否为完全二叉树

1.计算二叉树的高度:递归和迭代

  • 递归方法:每个节点的高度等于1加上左右子树高度最高的那个
	public int height2() {
		return height(root);
	}
	
	private int height(Node<E> node) {
		if (node == null) return 0;
		return 1 + Math.max(height(node.left), height(node.right));
	}
  • 迭代方法:利用层序遍历
    • 当while执行完一遍,则该层节点全都访问完,并且全都出队,所以队列里剩的就是下一层节点个数,所以也就是说height++
	public int height() {
		if (root == null) return 0;
		
		// 树的高度
		int height = 0;
		// 存储着每一层的元素数量,默认有一个
		int levelSize = 1;
		Queue<Node<E>> queue = new LinkedList<>();
		queue.offer(root);
		
		while (!queue.isEmpty()) {
			Node<E> node = queue.poll();
			levelSize--;
			
			if (node.left != null) {
				queue.offer(node.left);
			}
			
			if (node.right != null) {
				queue.offer(node.right);
			}

			if (levelSize == 0) { // 意味着即将要访问下一层
				levelSize = queue.size();
				height++;
			}
		}
		
		return height;
	}

2.判断一棵树是否为完全二叉树

在这里插入图片描述

  • 按照层序遍历思路可以遍历到所有节点,只需在其添加一些内容即可
    • node.left != null 节点入队,否则左子树为空说明肯定不是完全二叉树(如上图一个正确的完全二叉树可以知道)
    • node.right != null 节点入队,否则右子树为空,如果是完全二叉树且右子树为空,则该节点之后全是叶子节点(如上图一个正确的完全二叉树可以知道),所以让标识量leaf == true
    • 在开头判断即将考虑的节点是否真正为叶子节点,即标识量leaf == true但是它有孩子节点,则直接说明不是完全二叉树
    public boolean isComplete(){
        if (root == null) return false;
        Queue<Node<E>> queue = new LinkedList<>();
        queue.offer(root);
        boolean leaf = false;

        while(!queue.isEmpty()){
            Node<E> node = queue.poll();

            // leaf为true时说明已经遍历到后面全是叶子节点 但是!node.isLeaf()不为true说明它还有孩子节点,所以不是完全二叉树
            if (leaf && !node.isLeaf())
                return false;

            if(node.left != null){
                queue.offer(node.left);
            } else if (node.right != null){//左空右不空
                return false;
            }

            if (node.right != null) {
                queue.offer(node.right);
            } else {
                leaf = true;//右边为空,左边不用管,都是叶子节点---看真正的完全二叉树
            }
        }

        return true;
    }
总结:以后如果用到层序遍历去完成一些操作时候,建议先把层序遍历写好,也就意味着先保证每个节点都可以遍历到,在此基础上再加一些逻辑
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值